Yesterday I wrote a simple RSS reader in Actionscript 3.0. Nothing fancy really. But I thought I shared it with you. The code is pretty self explanational. TIP: Try to use embedded fonts, this will make a nicer transition between the feeds. NOTE: Not every html entitie is supported by Flash, like é (= é) for example. You must do string.replace( /é/, 'é' ) for every non supporting entity. But that's up to you ;)
An entity list: http://www.w3schools.com/tags/ref_entities.asp
BTW! Only RSS version 2.0 is supported.
Here's the snippet:
// which rss url to load? var RSSURL:String = "http://feeds.feedburner.com/tweakers/mixed"; // the length per feed in seconds var DURATION:int = 5; // how fast is the alpha wipe? value must be between 0 and 1! var FADE:Number = 0.07; // width and height of the feed var WIDTH:int = 640; var HEIGHT:int = 480; // the layout of the feed, you can use %title% and %desc% var LAYOUT:String = '<font face="Verdana" color="#000000" size="20"><b>%title%</b></font><br />' + '<font face="Verdana" color="#444444" size="14"><b>%desc%</b></font>'; // use embedded fonts? var EMBED_FONTS:Boolean = false; ////////////////////////////////////////////////////////////////////// // DON'T CHANGE WHAT'S UNDERNEATH! (unless you know what you doing) // ////////////////////////////////////////////////////////////////////// var loader:URLLoader = new URLLoader(); loader.addEventListener( Event.COMPLETE, evtComplete ); loader.addEventListener( SecurityErrorEvent.SECURITY_ERROR, evtSecurity ); loader.addEventListener( IOErrorEvent.IO_ERROR, evtIOError ); loader.load( new URLRequest( RSSURL + '?r=' + Math.random() ) ); var rss:XML; var arr:Array; var txtA:TextField; var txtB:TextField; var txtTemp:TextField; var pos:int = 0; var dWait:Date; var dNow:Date; function evtComplete( e:Event ):void { try { rss = new XML( loader.data ); } catch( e:Error ) { trace( 'XML Parse Error: ' + e ); return; } if( rss.@version != '2.0' ) { trace( 'Error: RSS feed not version 2.0, your version: ' + rss.@version ); return; } arr = new Array(); for each ( var item:XML in rss.channel.item ) { arr.push( { 'title': item.title, 'desc': item.description } ); } txtA = new TextField(); txtB = new TextField(); txtA.width = txtB.width = WIDTH; txtA.height = txtB.height = HEIGHT; txtA.alpha = txtB.alpha = EMBED_FONTS ? 0.0 : 1.0; txtA.antiAliasType = txtB.antiAliasType = AntiAliasType.ADVANCED; txtA.embedFonts = txtB.embedFonts = EMBED_FONTS; txtA.wordWrap = txtB.wordWrap = true; txtA.multiline = txtB.multiline = true; txtA.htmlText = getText(); txtB.htmlText = ''; dWait = new Date(); dWait.setSeconds( dWait.seconds + DURATION ); addEventListener( Event.ENTER_FRAME, evtEnterFrame ); addChild( txtA ); addChild( txtB ); } function evtEnterFrame( e:Event ):void { dNow = new Date(); if( dNow > dWait ) { txtB.htmlText = getText(); txtTemp = txtA; txtA = txtB; txtB = txtTemp; dWait.setSeconds( dNow.seconds + DURATION ); } if( EMBED_FONTS ) { txtA.alpha += ( 1.0 - txtA.alpha ) * FADE; txtB.alpha += ( 0.0 - txtB.alpha ) * FADE; } else { txtA.visible = true; txtB.visible = false; } } function evtIOError( e:IOErrorEvent ):void { trace( 'IOErrorEvent: ' + e ); } function evtSecurity( e:SecurityErrorEvent ):void { trace( 'SecurityErrorEvent: ' + e ); } function getText():String { if( !arr || arr.length == 0 ) { return ':('; } var txt:String = LAYOUT .replace( /%title%/, arr[pos].title ) .replace( /%desc%/, arr[pos].desc ) .replace( /é/, 'é' ); // as an example, you do the rest :P if( ++pos == arr.length ) { pos = 0; } return txt; }