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:ダウンロード
