flashcast:フリーで働くITエンジニア集団のブログ: google翻訳APIを使ったAIRアプリを作る!(常駐アプリ編)の続きです。
前回は、ただ常駐するだけのアプリを作りました。それに機能を追加していきたいと思います。
翻訳したいケースは、ホームページを見ている場合、PDFの資料を見ている場合など、いろいろあります。状況に応じて汎用的に使えるように、クリップボードを監視して文字がコピーされた時に自動的に翻訳するようにしたいと思います。
AIRではOSのクリップボードを操作することが出来ますが、変更があった時のイベントは取得できないため、Timerクラスを使って定期的にクリップボードの中身を監視するようにします。クリップボードの中身が、テキストで、かつ、変更があった時にのみ翻訳しにいきます。
package { import flash.desktop.Clipboard; import flash.desktop.ClipboardFormats; import flash.events.EventDispatcher; import flash.events.TimerEvent; import flash.utils.Timer; public class ClipboardManager extends EventDispatcher { private var timer:Timer; private var temp:String; public function ClipboardManager() { } public function initClipboardManager():void { timer = new Timer(1000); timer.addEventListener(TimerEvent.TIMER, onTimerHandler); if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) { temp = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String; } timer.start(); } private function onTimerHandler(event:TimerEvent):void { if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) { var clipboard:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String; if (clipboard != temp) { temp = clipboard; dispatchEvent(new TranslatorSampleEvent(TranslatorSampleEvent.CLIPBOARD_CHANGE)); } } } } }
クリップボードの中身が変わったら、イベントを発生させます。
オリジナルのイベントクラスを作成しました。
package { import flash.events.Event; public class TranslatorSampleEvent extends Event { public static const CLIPBOARD_CHANGE:String = "clipboard_change"; public function TranslatorSampleEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) { super(type, bubbles, cancelable); } } }
Eventクラスを継承して、イベントタイプを定数で定義すればいいだけです。
メインのロジックについては、以下のようにしました。クリップボードに変化があった時に発生させたイベントを、ハンドリングして翻訳処理を実行します。
package { import mx.core.Application; public class TranslatorSample3Base extends Application { private var imanager:IconManager; private var cmanager:ClipboardManager; public function TranslatorSample3Base():void { } public function initApp():void { imanager = new IconManager(); cmanager = new ClipboardManager(); imanager.initIconManager(); cmanager.initClipboardManager(); cmanager.addEventListener(TranslatorSampleEvent.CLIPBOARD_CHANGE, onClipboardChangeHandler); } private function onClipboardChangeHandler(event:TranslatorSampleEvent):void { trace("このタイミングで翻訳APIをコールする!"); } } }
翻訳する部分はまだ実装していません。実行するとデバッグトレース出力されます。
サンプルソース
サンプルソースをダウンロードできるようにしておきます。
- TranslatorSample3:ダウンロード