AIRデスクトップアプリケーションでQRコード生成を作ってみた。
処理概要は、、、
flash.net.URLRequest で Google Chart への要求を指定して
パラメータもTextInput や、DropDownList の結果で画像サイズなど
を入力したURLRequest を flash.net.URLLoader で、load 実行することで
生成するQRコード画像を URLLoader から読込む。
ユーザインターフェースの mxml ファイルは、、、
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:logic="org.qrmake.*"
width="525" height="497" backgroundColor="#C8FFFC"
>
<!-- xmlns:logic="org.qrmake.*" でロジック読込み宣言 -->
<fx:Declarations>
<!-- org.qrmake.QuertyQR 生成 -->
<logic:QuertyQR id="qr"/>
</fx:Declarations>
<s:TextInput id="target" x="81" y="22" width="397"/>
<s:Button id="queryButton" x="302" y="59" label="QRコード作成"/>
<s:Image id="img" x="26" y="148"/>
<s:DropDownList id="charType" x="27" y="107" labelField="name" selectedIndex="0">
<s:dataProvider>
<s:ArrayCollection>
<fx:Object name="UTF-8"/>
<fx:Object name="Shift_JIS"/>
<fx:Object name="ISO-8859-1"/>
</s:ArrayCollection>
</s:dataProvider>
</s:DropDownList>
<s:Label x="29" y="22" width="44" height="21" fontSize="14" text="データ" verticalAlign="middle"/>
<s:Button id="saveButton" x="408" y="57" label="画像保存"/>
<s:DropDownList id="size" x="27" y="58" labelField="widthxheigt" selectedIndex="5">
<s:dataProvider>
<s:ArrayCollection>
<fx:Object widthxheigt="40x40"/>
<fx:Object widthxheigt="64x64"/>
<fx:Object widthxheigt="120x120"/>
<fx:Object widthxheigt="160x160"/>
<fx:Object widthxheigt="200x200"/>
<fx:Object widthxheigt="240x240"/>
<fx:Object widthxheigt="280x280"/>
<fx:Object widthxheigt="320x320"/>
</s:ArrayCollection>
</s:dataProvider>
</s:DropDownList>
<s:DropDownList id="imgtype" x="163" y="58" width="97" labelField="disp" selectedIndex="0">
<s:dataProvider>
<s:ArrayCollection>
<fx:Object name="png" disp="PNG"/>
<fx:Object name="jpg" disp="JPEG"/>
<fx:Object name="gif" disp="GIF"/>
<fx:Object name="bmp" disp="BITMAP"/>
</s:ArrayCollection>
</s:dataProvider>
</s:DropDownList>
<s:Button id="resetButton" x="163" y="107" width="76" label="リセット"/>
</s:WindowedApplication>
問題のロジック、、、asソース
ボタンクリックハンドラの定義を as ソースで書いてしまった。
package org.qrmake
{
import flash.display.Loader;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
import flash.net.URLRequestMethod;
import flash.net.URLVariables;
import mx.controls.Alert;
import mx.core.IMXMLObject;
import mx.events.FlexEvent;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
public class QuertyQR implements IMXMLObject {
private var view:QRmake;
private var loader:URLLoader
private var file:File;
public function QuertyQR(){}
public function initialized(document:Object, id:String):void{
this.view = document as QRmake;
tthis.view.addEventListener(FlexEvent.CREATION_COMPLETE,creationCompleteHandler);
}
private function creationCompleteHandler(e:FlexEvent):void{
this.view.queryButton.addEventListener(MouseEvent.CLICK,create);
this.view.saveButton.addEventListener(MouseEvent.CLICK,saveButtonHandler);
this.view.resetButton.addEventListener(MouseEvent.CLICK,resetButtonHandler);
}
public function create(e:MouseEvent):void{
if (this.view.target.text != ""){
var ur:URLRequest = new URLRequest("http://chart.apis.google.com/chart");
var params:URLVariables = new URLVariables();
params.cht = "qr";
params.chs = this.view.size.selectedItem.widthxheigt;
params.chl = this.view.target.text;
params.choe = this.view.charType.selectedItem.name;
params.chof = this.view.imgtype.selectedItem.name;
ur.method = URLRequestMethod.GET;
ur.data = params;
this.loader = new URLLoader(ur);
this.loader.dataFormat = URLLoaderDataFormat.BINARY;
this.loader.addEventListener(Event.COMPLETE,readHandler);
this.loader.addEventListener(IOErrorEvent.IO_ERROR,faultHandler);
this.loader.load(ur);
}
}
private function readHandler(e:Event):void{
var whs:String = this.view.size.selectedItem.widthxheigt;
var ary:Array = whs.split("x");
this.view.img.width = ary[0];
this.view.img.height = ary[1];
this.view.img.source = this.loader.data;
}
private function faultHandler(e:IOErrorEvent):void{
Alert.show(e.text);
}
// for file Save
private function saveButtonHandler(e:MouseEvent):void{
if (this.loader != null){
this.file = new File();
file.browseForSave("画像の保存先を指定してください");
file.addEventListener(Event.SELECT,selectFile);
}else{
Alert.show("QRコードが作成されてません");
}
}
private function selectFile(e:Event):void{
var fs:FileStream = new FileStream();
fs.open(this.file,FileMode.WRITE);
var fl:Loader = new Loader();
fs.writeBytes(this.loader.data);
fs.close();
}
// for All clear
private function resetButtonHandler(e:MouseEvent):void{
this.view.target.text = "";
this.view.img.source = null;
this.loader = null;
}
}
}