Document

Adobe AIR 入門
1.Adobe AIR 紹介
2.デモ on Flex Builder 3
3.付録
(株)チェンジビジョン
梅田政利
1.Adobe AIR 紹介
Adobe AIR とは?
AIRのうれしさは?
環境について
Adobe AIRとは?
• 概要
– Adobe Integrated Runtimeの略
– デスクトップで動作するRIA(Rich Internet
Application)
– Adobe Labs(http://labs.adobe.com/)で公開
• 現在ベータ3。そろそろ正式リリース?
• 特徴
– クロスOS
• Windows / Mac / Linux
– 色々なテクノロジーと連携
• Flash / Flex / ActionScript
• HTML / CSS / JavaScript / Ajax
• PDF
– インストーラー作成が簡単
2
AIRのうれしさは?
• 既存のWEB技術を用いてデスクトップアプリが作れる
– HTML / JavaScript / Flex / ActionScript など
• ブラウザ上のアプリでできないことができる
–
–
–
–
–
ファイル操作
組み込みDB(SQLite)の操作
ドラッグ&ドロップ(外部から/外部への)
クリップボード(コピー/ペースト)
オフライン
• ネットワーク接続時に同期する、などももちろん可能
• 便利なコンポーネントやエフェクトが色々ある
3
環境について
• 実行環境
– ランタイムのインストールが必要
• インストーラーを使ったインストール
• シームレス・インストール(※参考URLが付録にあります)
– AIRアプリと同時にランタイムをインストールする機構
• 開発環境
– AIR SDK
• フリー
• コマンドライン
– Flex Builder 3
• 有償
• Eclipseベースの統合開発環境
4
2.デモ on Flex Builder 3
作成するアプリの説明
プロジェクト作成
ウィンドウ透明化
コンポーネント配置
コーディング
エフェクト
ファイル操作
ドラッグ&ドロップ
完成
作成するアプリの説明
• 目的
– 順番をランダムに決定する
• 基本仕様
– 人数入力欄にて人数を入力・変更する
• 人数の上限は99
– 名前入力欄から順番を決める人の名前を入力する
– 決定した順番と名前を、順番に沿って表に表示する
• 拡張仕様
– 順番が決まるところを、エフェクトで派手にする
– 表を外部にドラッグ&ドロップするとCSV形式でファイルに保存する
• ランダムな整数を取得するためのクラス(MyRandom)が使える
– MyRandom(lower:int, upper:int)
• コンストラクタ。引数は下限値と上限値。
– getBoundedRandomInt
• 範囲内からランダムな値を取得。同じ値は返さない。なくなったらー1を返す
6
プロジェクト作成
Sequencing.mxml
(MXMLソースファイル)
Sequencing-app.xml
(AIRアプリケーションXMLファイル)
7
ウィンドウ透明化
• ________.mxml
<mx:WindowedApplication (~略~)
backgroundColor="0xBBDDFF"
alpha="0.7">
背景色
アルファ(透過)値
• ____-app.xml
<initialWindow>
<systemChrome>none</systemChrome>
<transparent>true</transparent>
</initialWindow>
AIRのウィンドウ(※)
透過指定
(※)デフォルトでは"standard”。OS標準のウィンドウになる。
透明化
8
コンポーネント配置
1.デザインビューに切り替え
2.コンポーネントを配置
ソースビューで直接コーディングする
ことも可能です。
3.コンポーネントの詳細設定
9
コンポーネント配置~人数入力部
<mx:Label x="10" y="13" text="人数"/>
<mx:NumericStepper id="peopleNum" x="36" y="11" value="5" maximum="99" width="50"/>
10
コンポーネント配置~名前入力部
<mx:Label x="100" y="13" text="名前"/>
<mx:TextInput id="nameForm" x="124" y="11" width="133"/>
<mx:Button label="確定" x="261" y="11" width="56"/>
11
コンポーネント配置~結果表示部
<mx:DataGrid id="table" width="170" top="10" bottom="10" left="350" right="10">
<mx:columns>
<mx:DataGridColumn headerText="No." dataField="col1" width="40"/>
<mx:DataGridColumn headerText="名前" dataField="col2"/>
</mx:columns>
</mx:DataGrid>
12
コンポーネント配置~決定順番表示部
<mx:Label id="num" x="100" y="120" width="148" height="148" fontFamily="Arial"
fontSize="256" textAlign="center"/>
(※)“99”は、サイズとレイアウトの調整に利用しただけですので、MXMLからは削除しています
13
コーディング~アプリケーションの初期化
• applicationComplete
– 起動シーケンスの最後に呼び出される関数を登録する
<mx:WindowedApplication (略)applicationComplete="init()" >
<mx:Script>
<![CDATA[
private var myRandom:MyRandom;
private function init():void {
setup(peopleNum.value);
}
この間にActionScriptを記述する
private function setup(num:int):void {
myRandom = new MyRandom(1, num);
}
]]>
</mx:Script>
1からnumの範囲からランダムな値を取
得するMyRandomオブジェクトを生成
14
コーディング~人数変更の監視
• addEventListener
– イベントの種類と、その結果呼び出される関数を登録する
private function init():void {
setup(peopleNum.value);
peopleNum.addEventListener(Event.CHANGE, changePeopleNum);
}
peopleNumの変更があれば、
changePeopleNum関数を呼び出すように登録
private function changePeopleNum(ev:Event):void {
trace("人数が " + peopleNum.value + " に変わりました");
setup(peopleNum.value);
デバッグ文をコンソールに出力する。
}
デバッグモードのときに有効。
15
コーディング~表のデータと初期化
import mx.collections.ArrayCollection;
private var sequence:ArrayCollection; // 表に表示するデータ
private function setup(num:int):void {
sequence = new ArrayCollection();
for (var i:int = 0; i < num; i++) {
sequence.addItem({no:"", name:""});
}
myRandom = new MyRandom(1, num);
}
指定された人数で表を初期化する。
属性noとnameに空文字列を代入した
Objectオブジェクトをsequenceに追加
※Objectの属性は動的に追加できる
16
コーディング~DataGridへのデータ表示
• dataProvider
– 表示対象となるArrayやArrayCollectionなどをセットする
変数値の変化が、参照しているMXMLコンポーネント
に通知され、値が反映されるようになる
[Bindable]
private var sequence:ArrayCollection;
表示データ群
<mx:DataGrid id="table" dataProvider="{sequence}" top="10" bottom="10" left="350" right="10">
<mx:columns>
<mx:DataGridColumn headerText="No." dataField="no" width="40"/>
<mx:DataGridColumn headerText="名前" dataField="name" />
表示するデータの
</mx:columns>
属性
</mx:DataGrid>
17
コーディング~順番の決定
private function sequencing():void {
var randomInt:int =
myRandom.getRandomBoundedInt();
if (randomInt == -1) {
Alert.show(“設定人数を超過しました。”);
return;
}
num.text = String(randomInt);
addSequence();
}
private function addSequence():void {
var obj:Object = new Object();
obj.no = num.text;
obj.name = nameForm.text;
sequence.setItemAt(obj, int(num.text) - 1);
nameForm.text = "";
}
sequencing(
)
addSequence(
)
<mx:TextInput x="124" y="11" id="nameForm" width="133" enter="sequencing()" />
<mx:Button x="261" y="11" label="確定" width="56"
click="sequencing()" />
名前入力欄でEnterキーを押すか、確定ボタンをクリック
すると、sequencing()が呼ばれる
18
エフェクト~定義
• 決定順番コンポーネントを、大きく→小さく→ちょっと大きく→ちょっと小さく
– ①
• id="num"のコンポーネントに対してエフェクトをかける
• エフェクトは、<mx:children>に定義されたエフェクトの順次(Sequence)実行である
– ②
•
•
•
•
durationはエフェクト時間
origin[X | Y]は、拡大縮小の中心となるコンポーネント内の座標
zoom[Width | Height]Fromは、エフェクト開始時の縮尺
zoom[Width | Height]Toは、エフェクト終了時の縮尺
<mx:Sequence id="effect" target="{num}">
①
<mx:children>
<mx:Zoom duration="700" originX="75" originY="75"
zoomWidthFrom="1.0" zoomWidthTo="2.3" zoomHeightFrom="1.0"
<mx:Zoom duration="600" originX="75" originY="75"
zoomWidthFrom="2.3" zoomWidthTo="1.0" zoomHeightFrom="2.3"
<mx:Zoom duration="140" originX="75" originY="75"
zoomWidthFrom="1.0" zoomWidthTo="1.3" zoomHeightFrom="1.0"
<mx:Zoom duration="140" originX="75" originY="75"
zoomWidthFrom="1.3" zoomWidthTo="1.0" zoomHeightFrom="1.3"
</mx:children>
</mx:Sequence>
zoomHeightTo="2.3"/> ②
zoomHeightTo="1.0"/>
zoomHeightTo="1.3"/>
zoomHeightTo="1.0"/>
19
エフェクト~再生
sequencing(
)
挿入
effect.play()
addSequence(
)
private function sequencing():void {
(略)
num.text = String(randomInt);
effect.play();
エフェクトeffectを再生する
}
<mx:Sequence id="effect" target="{num}" effectEnd="addSequence()" >
エフェクト終了時に、
addSequence()を呼ぶ
20
エフェクト~補足
• Effect
– Zoom(拡大縮小)、Move(移動)、Rotate(回転)、Blur(ぼかし)、
Glow(発光効果)など色々
• 一部のエフェクトは、埋め込みフォントを使わないと文字が表示されない
ため、注意が必要(Rotateなど)
– エフェクト開始時やエフェクト終了時の処理を登録できる
• CompositeEffect
– Sequence(直列)とParallel(並列)がある
– Effectのサブクラス
• つまりCompositeEffectの入れ子も可能
21
ファイル操作
• CSV形式の表データファイルを作成し、そのオブジェクトを返す
① 関数createCsvFile の宣言。private関数で返り値の型はFile。
② テンポラリディレクトリの"sequence.csv"ファイルオブジェクトfile(Fileクラスの
オブジェクト)を作成する
③④ fileに書き出すfileStream(FileStreamクラスのオブジェクト)を作成する
⑤ CSV形式でヘッダ情報をシフトJISコードで出力する
⑥ CSV形式で、sequence(表)の内容をシフトJISコードで出力する
⑦ fileStreamを閉じる
⑧ fileオブジェクトをリターンする
private function createCsvFile():File {
//①
var file:File = File.createTempDirectory().resolvePath("sequence.csv"); //②
var fileStream:FileStream = new FileStream();
//③
fileStream.open(file, FileMode.WRITE);
//④
fileStream.writeMultiByte("No., 名前¥n", "shift_jis");
//⑤
for (var i:int = 0; i < sequence.length; i++) {
//⑥
fileStream.writeMultiByte(sequence.getItemAt(i).no + ", "
+ sequence.getItemAt(i).name + "\n", "shift_jis");
}
fileStream.close();
return file;
//⑦
//⑧
}
22
ドラッグ&ドロップ
• ドラッグ&ドロップとクリップボードをコントロールする
① アプリ初期化時に、マウスボタン押下時に実行する関数mouseDownと、
マウスボタンリリース時に実行する関数mouseUpを登録する
② アプリ外にマウスポインタが出たときに実行する関数dragOutを登録する
③ アプリ外にマウスポインタが出たときに実行する関数dragOutを登録解除する
④ クリップボードに表のCSVファイルをセットし、ドラッグマネージャーを初期化する
private function init():void { //①
:
table.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
table.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
}
private function mouseDown(ev:MouseEvent):void {
//②
table.addEventListener(MouseEvent.ROLL_OUT, dragOut); }
private function mouseUp(ev:MouseEvent):void {
//③
table.removeEventListener(MouseEvent.ROLL_OUT, dragOut); }
private function dragOut(ev:MouseEvent):void {
//④
var clipboard:Clipboard = new Clipboard();
clipboard.setData(ClipboardFormats.FILE_LIST_FORMAT, [createCsvFile()]);
NativeDragManager.doDrag(table, clipboard);
Arrayオブジェクト
}
23
完成
24
3.付録
ソースコード~ Sequencing.mxml
ソースコード~ MyRandom.as
アプリケーションXML~ Sequencing.xml
URL一覧
private function sequencing():void {
var randomInt:int = myRandom.getRandomBoundedInt();
if (randomInt == -1) {
Alert.show(“設定人数を超過しました。”);
return;
}
num.text = String(randomInt);
effect.play();
}
private function changePeopleNum(ev:Event):void {
setup(peopleNum.value);
}
private function setup(num:int):void {
sequence = new ArrayCollection();
for (var i:int = 0; i < num; i++) {
sequence.addItem({no:"", name:""});
}
myRandom = new MyRandom(1, num);
}
private function init():void {
setup(peopleNum.value);
peopleNum.addEventListener(Event.CHANGE, changePeopleNum);
table.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown);
table.addEventListener(MouseEvent.MOUSE_UP, mouseUp);
}
[Bindable]
private var sequence:ArrayCollection;
private var myRandom:MyRandom;
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.Alert;
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx=http://www.adobe.com/2006/mxml
layout="absolute“ alpha="0.7" backgroundColor="0xBBDDFF“
width="540" height="410“ applicationComplete="init()">
ソースコード~ Sequencing.mxml①
26
private function createCsvFile():File {
var file:File =
File.createTempDirectory().resolvePath("sequence.csv");
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.WRITE);
fileStream.writeMultiByte("No., 名前¥n", "shift_jis");
for (var i:int = 0; i < sequence.length; i++) {
fileStream.writeMultiByte(sequence.getItemAt(i).no + ", “
+ sequence.getItemAt(i).name + "\n", "shift_jis");
}
fileStream.close();
return file;
}
]]>
</mx:Script>
private function dragOut(ev:MouseEvent):void {
var clipboard:Clipboard = new Clipboard();
clipboard.setData(ClipboardFormats.FILE_LIST_FORMAT,
[createCsvFile()]);
NativeDragManager.doDrag(table, clipboard);
}
private function mouseUp(ev:MouseEvent):void {
table.removeEventListener(MouseEvent.ROLL_OUT, dragOut);
}
private function mouseDown(ev:MouseEvent):void {
table.addEventListener(MouseEvent.ROLL_OUT, dragOut);
}
private function addSequence():void {
var obj:Object = new Object();
obj.no = num.text;
obj.name = nameForm.text;
sequence.setItemAt(obj, int(num.text) - 1);
nameForm.text = "";
}
ソースコード~ Sequencing.mxml②
27
</mx:WindowedApplication>
<mx:Label id="num" x="100" y="120" width="148" height="148"
fontFamily="Arial" fontSize="256" textAlign="center"/>
<mx:DataGrid id="table" dataProvider="{sequence}“
left="350" right="10" top="10" bottom="10">
<mx:columns>
<mx:DataGridColumn headerText="No." dataField="no“ width="40"/>
<mx:DataGridColumn headerText="名前" dataField="name"/>
</mx:columns>
</mx:DataGrid>
<mx:Label x=“100” y=“13” text=“名前”/>
<mx:TextInput id="nameForm" x="124" y="11" width="133"
enter="sequencing()"/>
<mx:Button x="261" y="11" label="確定" width="56"
click="sequencing()"/>
<mx:Label x=“10” y=“13” text=“人数”/>
<mx:NumericStepper id=“peopleNum” x=“36” y=“11” value=“5”
maximum=“99” width=“50”/>
<mx:Sequence id="effect" target="{num}“ effectEnd="addSequence()">
<mx:children>
<mx:Zoom duration="700" originX="75" originY="75"
zoomWidthFrom="1.0“ zoomWidthTo="2.3“
zoomHeightFrom="1.0" zoomHeightTo="2.3"/>
<mx:Zoom duration="600" originX="75" originY="75"
zoomWidthFrom="2.3“ zoomWidthTo="1.0“
zoomHeightFrom="2.3" zoomHeightTo="1.0"/>
<mx:Zoom duration="140" originX="75" originY="75"
zoomWidthFrom="1.0“ zoomWidthTo=“1.3”
zoomHeightFrom=“1.0” zoomHeightTo=“1.3”/>
<mx:Zoom duration=“140” originX=“75” originY=“75”
zoomWidthFrom=“1.3“ zoomWidthTo=”1.0”
zoomHeightFrom=“1.3” zoomHeightTo=“1.0”/>
</mx:children>
</mx:Sequence>
ソースコード~ Sequencing.mxml③
28
ソースコード~ MyRandom.as
package {
import mx.collections.ArrayCollection;
public class MyRandom {
private var remainingValues:ArrayCollection = new ArrayCollection();
public function MyRandom(lower:int, upper:int) {
remainingValues = new ArrayCollection();
for (var i:int = lower; i <= upper; i++) {
remainingValues.addItem(i);
}
}
ランダムに取得する整数の下限と上限を与
え、その範囲の整数を、ArrayCollectionに代
入する
public function getRandomBoundedInt():int {
if (remainingValues.length == 0) {
残りがない場合は –1 を返す
return -1;
}
var index:int = int(Math.random() * remainingValues.length);
var randomInt:int = remainingValues.getItemAt(index) as int;
remainingValues.removeItemAt(index);
ランダムにArrayCollectionから値を取り出し
return randomInt;
て返り値とする
}
}
}
29
アプリケーションXML~Sequencing.xml
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0.M6">
<!-- The application identifier string, unique to this application. Required. -->
<id>Sequencing</id>
<!-- Used as the filename for the application. Required. -->
<filename>Sequencing</filename>
<!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required. -->
<version>v1</version>
<!-- Settings for the application's initial window. Required. -->
<initialWindow>
<content>[この値は Flex Builder の出力ファイル app.xml に上書きされます]</content>
<systemChrome>none</systemChrome>
<transparent>true</transparent>
</initialWindow>
SDKにて開発するときは、この箇所をswf
ファイル名に置き換える必要がある
</application>
30
URL一覧
• ダウンロード
– AIR実行環境
• http://labs.adobe.com/downloads/air.html
– 開発環境のダウンロード
• http://labs.adobe.com/technologies/air/develop_flex.html
• 参考記事等
– AIR実行環境のシームレス・インストール
• http://journal.mycom.co.jp/series/air/015/index.html
– サンプル公開
• http://labs.adobe.com/technologies/air/samples/
• ユーザーコミュニティー
– FxUG(Flex User Group)
• http://www.fxug.net/
• まさとしのAIR自習帳
– http://d.hatena.ne.jp/masatoshisw20/
• 私のブログです。よろしくお願いします。m(._.)m
31
ご清聴ありがとう
ございました
32