FLASHにatomフィードを読み込んで表示する


rssloader.jpg

FLASHにatomフィードを読み込み表示。さらに、モリサワのMBゴシックで表示したかったのでフォントを埋め込んだswfファイルを読み込ませます。

MT RSS Loader

このサイトをリニューアルするときに使いたいので作りました。仕組みを作るのに精一杯で表現はひどいです・・

今回はatomフィードを使ってみましたが、よく考えたらFLASHに全文読み込む必要は無いのでRSSフィードで良かったかも。

クラス主体のコーディング手法は FLASH OOP を参考にしました。やっと mx.eventDispatcher の使い方が分かってきた。また、FLASHでXMLをカンタンに扱うことのできるXPath4AS2というAS2ライブラリをつかってみました。

作成ファイル

rssloader.fla
 ┗embed_font_mc:MovieClip
・embed_font_mcはフォントを埋め込んだSWFの読み込み用に作成したMCです。embed_font_mcの子要素で埋め込んだフォントを使用できます。

MBGothic.fla
・MBGothic Bold を埋め込んだテキストフィールドを作成しパブリッシュします。

rssloader.as
・RSSLoaderパッケージのInitクラスのインスタンスを作成します。rssloader.flaにインクルードしておきます。

/RSSLoader(パッケージ)
 ┗Init.as
  ・RSSLoaderパッケージ内の必要なクラスのインスタンスを作成します。
  ・XMLModelクラスのloadDataメソッドを実行し、読み込みを開始します。
 ┗XMLLoader.as
  ・XMLデータを読み込みます。
 ┗XMLModel.as
  ・読み込んだXMLデータを整形し、onDataイベントを発行します。
 ┗EmbedFont.as
  ・onDataイベントを受信し、embed_font_mcにMBGothic.swfを読み込みます。
  ・onEmbedFontイベントを発行します。
 ┗View.as
  ・onDataイベントでXMLデータを受け取ります。
  ・onEmbedFontイベントを受信し、embed_font_mcにテキストフィールドを作成しXMLデータを表示します。

と、結構大量のスクリプトになったのでソースは端折って掲載します。

Init.as

//Init.as
import RSSLoader.*;
class RSSLoader.Init
{
 private var mc:MovieClip;
 //コンストラクタ
 function Init( _mc:MovieClip )
 {
  mc = _mc;
  //XMLモデルのインスタンス
  var model:XMLModel = new XMLModel();
  //XMLデータの読み込み
  model.loadData("http://www.110chang.com/atom.xml");
  //埋め込みフォント読み込みのインスタンス
  var my_embed_font:EmbedFont = new EmbedFont( model, mc.embed_font_mc );
  //SWFファイルのURI指定
  my_embed_font.setURI("http://www.110chang.com/lab/mt_rss_loader/MBGothic.swf");
  //my_embed_font.setURI( "./MBGothic.swf" );
  //ビューのインスタンス
  var my_view:View = new View( model, mc.embed_font_mc );
  //埋め込みフォントにリスナー登録
  my_embed_font.addEventListener( "onEmbedFont", my_view );
 }
}

XMLModel

import RSSLoader.SuperModel;
import RSSLoader.XMLLoader;
import com.xfactorstudio.xml.xpath.*
//スライドモデルクラス
class RSSLoader.XMLModel extends RSSLoader.SuperModel
{
 //コンストラクタ
 function XMLModel()
 {
  //コンストラクタ関数のスーパークラスバージョンを呼び出す
  super();
 }
 //ファイル読み込み
 function loadData( url:String ):Void
 {
  XMLLoader.loadXML( url, parse, setData, this );
 }
 //XML解析
 function parse( xml:XML ):Object
 {
  //ここでxpathを使って解析します。
  //titles[i] = XPath.selectNodes( xml, "/feed/entry["+(i)+"]/title/text()" );
  //bodies[i] = XPath.selectNodes( xml, "/feed/entry["+(i)+"]/content/text()" );
  //dates[i] = XPath.selectNodes( xml, "/feed/entry["+(i)+"]/published/text()" );
  //とかやってまとめて返します。
  //data_obj[i] = { title:titles[i], body:bodies[i], date:dates[i] };
  return data_obj;
 }
 private function entryNodesLength( xml:XML ):Number
 {
  var XMLPath:String = "/feed/entry";
  var my_array:Array = XPath.selectNodes( xml, XMLPath );
  return my_array.length;
 }
}

EmbedFont.as

import RSSLoader.XMLModel;
class RSSLoader.EmbedFont extends RSSLoader.SuperView
{
 private var mc:MovieClip;
 private var model:XMLModel;
 private var uri:String;
 //コンストラクタ
 function EmbedFont( _model:XMLModel, _mc:MovieClip )
 {
  super();
  mc = _mc;
  model = _model;
  model.addEventListener( "onData", this );
 }
 function setURI( _uri:String ):Void
 {
  uri = _uri;
 }
 private function onData():Void
 {
  var my_mcl = new MovieClipLoader();
  my_mcl.addListener( this );
  my_mcl.loadClip( uri, mc );
 }
 private function onLoadStart( target_mc:MovieClip ):Void
 {
  //ロード開始
 }
 private function onLoadProgress( target_mc:MovieClip, loadedBytes:Number, totalBytes:Number ):Void
 {
  //プログレスバー表示など
 }
 private function onLoadComplete( target_mc:MovieClip ):Void
 {
  //ロード終了
  dispatchEvent({ type:"onEmbedFont" });
 }
}

View.as

import RSSLoader.XMLModel;
class RSSLoader.View extends RSSLoader.SuperView
{
 private var mc:MovieClip;
 private var model:XMLModel;
 private var data_obj:Object;
 //コンストラクタ
 function View( _model:XMLModel, _mc:MovieClip )
 {
  super();
  model = _model;
  mc = _mc;
  model.addEventListener( "onData", this );
 }
 function onData( obj:Object ):Void
 {
  data_obj = obj.data
 }
 function onEmbedFont():Void
 {
  for( var prop in data_obj )
  {
   //タイトルを作成
   makeTitle();
  }
 }
 private function makeTitle():Void
 {
  //テキストフォーマットやテキストフィールドの作成
 }
}

One Comment

  • ねこまま wrote:

    Flashで作成した全面トップページにAtomのフィードを読み込みたいと思い、いろいろ調べて試してますが、条件が合わなかったり、文字化けしたりでうまくいきません。
    ちょうどこちらのサイトで「ATOM」「AS2.0」とぴったりのでしたのでご教授いただけないでしょうか?
    正直ASはあまり得意ではないのでサンプルなどありましら助かります。
    どうぞよろしくお願いします。

コメントを残す

Your email is never shared.Required fields are marked *