demo

画像の作成

画像を準備するところからはじめましょう。
Flashで作成してもいいし、PhotoShopなどの画像編集ソフトで作ってもいいです。
今回はこんな2つの画像を用意しました。

画像サンプル

「frame.png」はウィジェットの枠となる画像です。真ん中の縞々の部分は透明という意味です。なのでpng32で保存します。
「panel.png」は文字の部分の背景に表示される画像です。透明度はないので保存形式は何でもいいですが、ここではpng形式で保存しました。

PHPでTwitterのつぶやきを取得する

Flashで作ると言いつつTwitterからの情報の取得はPHPで行います。
Flashだけでも可能ですが、クロスドメインポリシーの関係でいろいろ面倒なことをしなくてはいけないらしいです。
なのでこの部分はサーバースクリプトに任せた方が簡単だと思います。

load.php

  1. <?php
  2. $req = @file_get_contents('http://twitter.com/statuses/user_timeline/[ユーザー名].xml');
  3. header("Content-Type: application/xml");
  4. echo $req;
  5. ?>

utf-8で「load.php」という名前で保存します。
当然ですがURLの[ユーザー名]は自身のものに置き換えてください。
またURLの後ろにパラメータを設定することで取得する条件を指定することができます。
たとえば「[ユーザー名].xml?count=5」で5だけツイートを取得できます。
詳しくは下記Twitter APIをご確認ください。

Twitter API 仕様書 日本語訳

Flashで作成した画像を読み込み

エクスプローラーから作成した画像をFlashにドラッグするか、「ファイル」→「読み込み」→「ライブラリに読み込み」で画像を読み込みます。
次にリンケージ設定を行います。
ライブラリに読み込まれたアイテムを右クリックし「リンケージ」を選択します。リンケージプロパティウインドウが表示されたらクラス名を設定します。
ここでは「frame.png」をクラス名「Frame」に、「panel.png」を「Panel」としました。
これでActionScriptからライブラリのアイテムにアクセスできるようになります。

リンケージ設定画面

ステージサイズは「frame.png」と同じにしておきます。
ドキュメントクラスも忘れず設定しておきましょう。ここでは「Main」とします。これで準備は完了です。

PHPからつぶやきを取得して切り替えるスクリプト

もしかしたらアニメーションなんていらねーって人もいるかもしれないので、まずは表示されたつぶやきを単純に切り替えるだけのものを作りたいと思います。
とりあえずグローバル変数と全体のメソッドです。

Main.as

  1. package
  2. {
  3. import flash.display.Sprite;
  4. import flash.net.URLLoader;
  5. import flash.net.URLRequest;
  6. import flash.events.Event;
  7. import flash.events.IOErrorEvent;
  8. import flash.text.TextField;
  9. import flash.text.TextFieldType;
  10. import flash.utils.Timer;
  11. import flash.events.TimerEvent;
  12. import flash.display.BitmapData;
  13. import flash.display.Bitmap;
  14. public class Main extends Sprite
  15. {
  16. var _textArray:Array; //テキストフィールドを入れる配列
  17. var _textContainer:Sprite; //ツイートを入れるコンテナ
  18. var _currentNo:uint; //現在のNo
  19. var _timerObj:Timer; //ツイート切り替えのタイマー
  20. var _txtWidth:uint; //テキストの横幅
  21. var _panelHeight:uint; //パネルを縦幅
  22. public function Main() {}
  23. /* *****************************************
  24. RSS取得失敗時の処理
  25. ****************************************** */
  26. public function ioError(event:IOErrorEvent):void {}
  27. /* *****************************************
  28. RSSロード完了後の処理
  29. ****************************************** */
  30. public function loadComp(event:Event):void {}
  31. /* *****************************************
  32. タイマー処理(一定時間で次のツイート)
  33. ****************************************** */
  34. function timerEvent(event:Event):void {}
  35. }
  36. }

コンストラクタで作成したphpファイルを読み込み、ロード完了後にツイートを表示します。タイマーイベントではツイートを切り替えます。

function Main – Main.as

  1. public function Main()
  2. {
  3. var xmlURL:String = "load.xml"; //PHPファイルの指定
  4. _timerObj = new Timer(5000); //切り替えの時間設定
  5. _currentNo = 0; //現在のツイート(最初は0)
  6. _textArray = new Array(); //テキストフィールドを入れる配列
  7. _txtWidth = 260; //テキストの横幅
  8. _panelHeight = 120; //パネルの縦幅

コンストラクタ部分です。
ここでグローバル変数に対して初期設定を行っています。
「xmlURL」で作成したphpファイルのファイル名を指定します。
この場合同一のフォルダに入れることになりますが、フォルダが別の場合は変更してください。絶対パスにした方がいいかもしれません。
「_txtWidth」「_panelHeight 」はデザインによって調節してください。

function Main – Main.as

  1. //ライブラリからPanelを配置
  2. var panelData:BitmapData = new Panel(100, 100);
  3. var panelImg:Bitmap = new Bitmap(panelData);
  4. panelImg.x = 26;
  5. panelImg.y = 57;
  6. this.addChild(panelImg);
  7. //テキストコンテナを配置
  8. _textContainer = new Sprite();
  9. _textContainer.x = 33;
  10. _textContainer.y = 63;
  11. this.addChild(_textContainer);
  12. //ライブラリからFrameを配置
  13. var frameData:BitmapData = new Frame(100, 100);
  14. var frameImg:Bitmap = new Bitmap(frameData);
  15. this.addChild(frameImg);

Flashで読み込んだ画像の配置と、取得したツイートを入れるためのコンテナを配置しています。
addChildは順番が大事で、最初にaddChildしたものから順番にレイヤーを重ねたようになります。
なのでPanel→テキスト→Frameの順に追加していけばFrameが一番上になります。
これでテキスト部分を動かしても、表示されるのはFrameの透明の部分だけになります。

あとx,yの部分はやはりデザインによって調整してください。

addChildイメージ

function Main – Main.as

  1. //RSSのロード
  2. var xmlLoader:URLLoader = new URLLoader();
  3. xmlLoader.load(new URLRequest(xmlURL));
  4. //ロード完了時イベント
  5. xmlLoader.addEventListener(Event.COMPLETE, loadComp);
  6. //ロードエラー時イベント
  7. xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioError);
  8. }

コンストラクタ最後の部分です。
ローダーと、ロード完了とエラー時のイベントリスナーです。

function ioError – Main.as

  1. public function ioError(event:IOErrorEvent):void
  2. {
  3. var error_txt = new TextField();
  4. error_txt.text = "RSSの取得に失敗しました。";
  5. error_txt.width = _txtWidth;
  6. _textContainer.addChild(error_txt);
  7. }

指定したload.phpが取得できなかった場合に「RSSの取得に失敗しました。」と表示されます。
でもこれだとTwitter本体のサイトがダウンしたときはエラーが表示されないかもしれない……
たぶんどっかでそれ用の処理をする必要があると思います。

function loadComp – Main.as

  1. public function loadComp(event:Event):void
  2. {
  3. //ロードしたXMLをrssに入れる
  4. var rss:XML = new XML(event.target.data);
  5. //ツイートの数だけテキストフィールドを作成
  6. var count:uint = 0;
  7. for each(var item:Object in rss.status.text) {
  8. _textArray.push(new TextField());
  9. _textArray[count].text = item;
  10. //横幅設定
  11. _textArray[count].width = _txtWidth;
  12. //折り返し設定ON
  13. _textArray[count].multiline = _textArray[count].wordWrap = true;
  14. count++;
  15. }
  16. //最初のツイートを表示
  17. _textContainer.addChild(_textArray[0]);
  18. //タイマーイベントスタート
  19. _timerObj.addEventListener(TimerEvent.TIMER, timerEvent);
  20. _timerObj.start();
  21. }

load.phpを無事ロードすることができたら、for each文で読み込んだツイートの数だけテキストフィールドを作成しています。
最後にタイマーをスタートして一定時間ごとに「timerEvent」を実行します。

function timerEvent – Main.as

  1. function timerEvent(event:Event):void {
  2. //表示されているツイートを削除
  3. while(_textContainer.numChildren > 0){
  4. _textContainer.removeChildAt(0);
  5. }
  6. _currentNo++ //現在の番号を次の配列に
  7. //次のツイートを表示
  8. _textContainer.addChild(_textArray[_currentNo]);
  9. //最後の配列にきたら最初に戻る
  10. if (_currentNo >= _textArray.length) {
  11. _currentNo = 0;
  12. }
  13. }

タイマーイベントによって一定時間ごとに実行されるメソッドです。
表示されていたテキストをremoveして「_currentNo」を一つ進めて次のツイートを表示させています。
最後の配列にきたら新たに読み込んだするとすごくめんどくさそうなので、配列の最初に戻ってループさせています。

これで単純につぶやきを切り替えるスクリプトは完成です。

アニメーションさせる前の準備

アニメーション処理にはTweenerというライブラリを使用します。
下記URLからダウンロードしてください。

Tweener

ファイルを解凍したら「caurina」というフォルダをflaファイルと同一の階層におき、新たにインポートを追加します。

Main.as

  1. import caurina.transitions.Tweener;

これでTweenerを使用する準備ができました。

アニメーションで切り替えるスクリプト

では、ちょっと改良してツイートをアニメーションさせてみましょう。
新たにツイートを移動するメソッド「changeMoveTweet」と、移動した後にツイートをremoveするメソッド「moveComp」を追加します。

Main.as

  1. /* *****************************************
  2. ツイートの切り替え処理
  3. ****************************************** */
  4. function changeMoveTweet(nextNo:uint) {
  5. _textContainer.addChild(_textArray[nextNo]);
  6. _textArray[nextNo].y = _panelHeight;
  7. //Tweener移動処理
  8. Tweener.addTween(_textArray[nextNo], {
  9. y:0,
  10. transition:"liner",
  11. time:2
  12. });
  13. Tweener.addTween(_textArray[_currentNo], {
  14. y: -_panelHeight,
  15. transition:"liner",
  16. time:2,
  17. onComplete:moveComp,
  18. onCompleteParams:[_textArray[_currentNo]]
  19. });
  20. //次の番号を現在の番号に
  21. _currentNo = nextNo;
  22. }
  23. /* *****************************************
  24. Tweener移動後
  25. ****************************************** */
  26. function moveComp(tf:TextField):void{
  27. //移動後のテキスト削除
  28. _textContainer.removeChild(tf);
  29. }

ほとんどTweenerの説明になりますが、ここでは次のツイートを「panelHeight」文だけ下に配置したら2秒書けてy=0に移動して、同時に現在のツイートは「panelHeight」文だけ上に移動しています。
また、「onComplete」で移動後に実行するメソッドを指定して、「onCompleteParams」にはメソッドの引数を指定できる。

最後に「changeMoveTweet」を実行する為に「timerEvent」を下記に変更しましょう。
以前は直接にremove、addChildを書いていましたが、「changeMoveTweet」メソッドに処理を書きましたので、
タイマーイベントで「changeMoveTweet」を実行するだけですね。

function timerEvent – Main.as

  1. function timerEvent(event:Event):void {
  2. if (_currentNo >= (_textArray.length - 1)) {
  3. changeMoveTweet(0);
  4. } else {
  5. changeMoveTweet(_currentNo + 1);
  6. }
  7. }

なんか余計なことばかりでTwitter的なことはほとんど書いていないきがしますが、一応これで完成です。
あとはハッシュタグを正規表現でリンクとかつけたりとかいろいろ改良する点はありそうです。

最終的なASファイル

Main.as