2009年2月8日日曜日

[Air]はてなの注目エントリをながら見するツールを作った

いつも家でご飯食べるとき、両手を使わないでウェブが見れるツールが欲しいと思っていたので、Airで作ってみました。

以下のリンクからダウンロードして、インストールすれば動くはずですが、初Airなので自信無し。
nagarami.air

はてなブックマークの注目エントリ(コンピュータと科学)のRSSを取得して、載っているURLにアクセスして行きます。
画面は上下2画面あって、コンピュータの注目エントリが上画面、科学が下画面に表示されます。
スクロールは3秒間隔で一画面分ずつ動いて行きます。
実行時はこんなかんじ。


以下長いですがソースです。

Main.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:nagara="*" layout="absolute" applicationComplete="onInit()">
    <mx:Script>
     <![CDATA[
        import HtmlViewer;
        private function onInit():void {
            var htmlViewer1:HtmlViewer = new HtmlViewer();
            var htmlViewer2:HtmlViewer = 
            new HtmlViewer("http://b.hatena.ne.jp/entrylist/knowledge?sort=hot&threshold=&mode=rss");
            loader1.source = htmlViewer1 
            loader2.source = htmlViewer2 
        }   
     ]]>    
    </mx:Script>
    <mx:VBox>
        <mx:SWFLoader id="loader1" width="100%" height="100%"/>
        <mx:HRule width="100%"/>
        <mx:SWFLoader id="loader2" width="100%" height="100%"/>
    </mx:VBox>
</mx:WindowedApplication>


HtmlViewer.as
package
{
    import flash.html.HTMLLoader;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;

    public class HtmlViewer extends HTMLLoader
    {
        private var urls:Array;
        private var scrollTimer:Timer;
        private var loader:URLLoader;
        private var windowHeight:int = 360;
        public function HtmlViewer(seedUrl:String="http://b.hatena.ne.jp/entrylist/it?sort=hot&threshold=&mode=rss")
        {
            this.width = 1000;
            this.height = windowHeight;

            loader = new URLLoader();
            var req:URLRequest = new URLRequest(seedUrl);
            loader.addEventListener(Event.COMPLETE, onRssLoadComplete);
            loader.load(req);
        }

        private function onRssLoadComplete(event:Event):void
        {
            var RSS:Namespace   = new Namespace("",     "http://purl.org/rss/1.0/");
            var RDF:Namespace   = new Namespace("rdf",  "http://www.w3.org/1999/02/22-rdf-syntax-ns#");
            var xml:XML = new XML(event.target.data);
            urls = new Array();
            for each(var url:XML in xml.RSS::item){
                urls.push(url.@RDF::about);
            }

            loadNew();
        }

        private function loadNew():void
        {
            var url:String = urls.pop();
            if (url != null)
            {
                this.addEventListener(Event.COMPLETE, scrollHtml);
                var urlReq:URLRequest = new URLRequest(url);
                this.load(urlReq);
            }
        }

        private function scrollHtml(event:Event):void
        {
            var maxScrollCount:int = (this.contentHeight - windowHeight) / windowHeight;
            scrollTimer = new Timer(3000, maxScrollCount+2);
            scrollTimer.addEventListener(TimerEvent.TIMER, onTick);
            scrollTimer.addEventListener(TimerEvent.TIMER_COMPLETE,showNext);
            scrollTimer.start();
        }

        private function showNext(event:TimerEvent):void
        {
            loadNew();
        }

        private function onTick(event:TimerEvent):void
        {
            this.scrollV += windowHeight;
        }
    }
}

0 件のコメント:

コメントを投稿