118
Flex カカ カカカカ カカカカ ( 有 )CO-CONV 有有 有

Flex カス タムコン ポーネン ト の 作 り 方

  • Upload
    johnda

  • View
    69

  • Download
    0

Embed Size (px)

DESCRIPTION

Flex カス タムコン ポーネン ト の 作 り 方. ( 有 )CO-CONV 最田 健一. 自己紹介. にとよん という名前でブログやってます. http://tech.nitoyon.com/. Agenda. Flex 概要 非カスタムコンポーネントな開発 カスタムコンポーネント開発 まとめ. 1. Flex 概要. Flash と ActionScript がベース. しかし. タイムラインが. ない. プログラマ用. Flash やってた人より. Java や C# 経験者 の方がとっつきやすい. 特徴. 豊富 な GUI パーツ. - PowerPoint PPT Presentation

Citation preview

Page 1: Flex カス タムコン ポーネン ト の 作 り 方

Flex カスタムコンポーネントの作り方 ( 有 )CO-CONV

最田 健一

Page 2: Flex カス タムコン ポーネン ト の 作 り 方

自己紹介

Page 3: Flex カス タムコン ポーネン ト の 作 り 方

にとよん という名前でブログやってます

http://tech.nitoyon.com/

Page 4: Flex カス タムコン ポーネン ト の 作 り 方

Agenda

1. Flex 概要2.非カスタムコンポーネントな

開発3.カスタムコンポーネント開発4.まとめ

Page 5: Flex カス タムコン ポーネン ト の 作 り 方

Page 6: Flex カス タムコン ポーネン ト の 作 り 方

Flex概要

Page 7: Flex カス タムコン ポーネン ト の 作 り 方

Flash と ActionScript がベース

Page 8: Flex カス タムコン ポーネン ト の 作 り 方

しかし

Page 9: Flex カス タムコン ポーネン ト の 作 り 方

タイムラインが

Page 10: Flex カス タムコン ポーネン ト の 作 り 方

ない

Page 11: Flex カス タムコン ポーネン ト の 作 り 方

プログラマ用

Page 12: Flex カス タムコン ポーネン ト の 作 り 方

Flash やってた人

より

Page 13: Flex カス タムコン ポーネン ト の 作 り 方

Java や C#経験者の方がとっつきやす

Page 14: Flex カス タムコン ポーネン ト の 作 り 方

特徴

Page 15: Flex カス タムコン ポーネン ト の 作 り 方

豊富なGUI パー

Page 16: Flex カス タムコン ポーネン ト の 作 り 方
Page 17: Flex カス タムコン ポーネン ト の 作 り 方

XMLで配置

Page 18: Flex カス タムコン ポーネン ト の 作 り 方

具体例<mx:Panel title=" パネル "> <mx:HBox> <mx:Button label=" ボタン "/> <mx:CheckBox label=" チェックボックス "/> <mx:RadioButton label=" ラジオボタン "/> <mx:ComboBox dataProvider="{array}"/> </mx:HBox></mx:Panel>

Page 19: Flex カス タムコン ポーネン ト の 作 り 方

具体例<mx:Panel title=" パネル "> <mx:HBox> <mx:Button label=" ボタン "/> <mx:CheckBox label=" チェックボックス "/> <mx:RadioButton label=" ラジオボタン "/> <mx:ComboBox dataProvider="{array}"/> </mx:HBox></mx:Panel>

Page 20: Flex カス タムコン ポーネン ト の 作 り 方

具体例<mx:Panel title=" パネル "> <mx:HBox> <mx:Button label=" ボタン "/> <mx:CheckBox label=" チェックボックス "/> <mx:RadioButton label=" ラジオボタン "/> <mx:ComboBox dataProvider="{array}"/> </mx:HBox></mx:Panel>

Page 21: Flex カス タムコン ポーネン ト の 作 り 方

具体例<mx:Panel title=" パネル "> <mx:HBox> <mx:Button label=" ボタン "/> <mx:CheckBox label=" チェックボックス "/> <mx:RadioButton label=" ラジオボタン "/> <mx:ComboBox dataProvider="{array}"/> </mx:HBox></mx:Panel>

Page 22: Flex カス タムコン ポーネン ト の 作 り 方

具体例<mx:Panel title=" パネル "> <mx:HBox> <mx:Button label=" ボタン "/> <mx:CheckBox label=" チェックボックス "/> <mx:RadioButton label=" ラジオボタン "/> <mx:ComboBox dataProvider="{array}"/> </mx:HBox></mx:Panel>

Page 23: Flex カス タムコン ポーネン ト の 作 り 方

流行し始め

Page 25: Flex カス タムコン ポーネン ト の 作 り 方

SearchMash ( Google の検索実験サイト)

Page 26: Flex カス タムコン ポーネン ト の 作 り 方

Google Analytics AIR beta

※ これは AIR だが UI は Flex で作られている

Page 27: Flex カス タムコン ポーネン ト の 作 り 方

弊社某案件

Page 28: Flex カス タムコン ポーネン ト の 作 り 方

2

Page 29: Flex カス タムコン ポーネン ト の 作 り 方

非カスタムコンポーネント

な開発

Page 30: Flex カス タムコン ポーネン ト の 作 り 方

鉄則

Page 31: Flex カス タムコン ポーネン ト の 作 り 方

可能な限り既存のコンポ

ーネントを使おう

Page 32: Flex カス タムコン ポーネン ト の 作 り 方

複雑な塊には複合コンポーネントを定義

Page 33: Flex カス タムコン ポーネン ト の 作 り 方

Page 34: Flex カス タムコン ポーネン ト の 作 り 方

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe..."> <mx:Label text=" 春休み "/> <mx:HBox> <mx:DateField/> <mx:Label text=" ~ "/> <mx:DateField/> </mx:HBox></mx:Application>

Page 35: Flex カス タムコン ポーネン ト の 作 り 方

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe..."> <mx:Label   text=" 春休み "/> <mx:HBox> <mx:DateField/> <mx:Label text=" ~ "/> <mx:DateField/> </mx:HBox></mx:Application>

Page 36: Flex カス タムコン ポーネン ト の 作 り 方

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe..."> <mx:Label   text=" 春休み "/> <mx:HBox> <mx:DateField/> <mx:Label text=" ~ "/> <mx:DateField/> </mx:HBox></mx:Application>複合コンポーネント化

Page 37: Flex カス タムコン ポーネン ト の 作 り 方

<?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe..." xmlns:comp="*">

<mx:Label   text=" 春休み "/>

<comp:DateRange/>

</mx:Application>

Page 38: Flex カス タムコン ポーネン ト の 作 り 方

<?xml version="1.0" encoding="utf-8"?><mx:HBox xmlns:mx="http://www.adobe .com/2006/mxml"> <mx:DateField> <mx:Label text=" ~ "/> <mx:DateField/></mx:HBox>

DateRange.mxml

Page 39: Flex カス タムコン ポーネン ト の 作 り 方

利点

Page 40: Flex カス タムコン ポーネン ト の 作 り 方

構造がすっきり

Page 41: Flex カス タムコン ポーネン ト の 作 り 方

実装の責任範囲が明確に

Page 42: Flex カス タムコン ポーネン ト の 作 り 方

再利用性UP

Page 43: Flex カス タムコン ポーネン ト の 作 り 方

注意点

Page 44: Flex カス タムコン ポーネン ト の 作 り 方

大きなクラスも問題だが

Page 45: Flex カス タムコン ポーネン ト の 作 り 方

分けすぎにも注意

Page 46: Flex カス タムコン ポーネン ト の 作 り 方

バランスが大事

Page 47: Flex カス タムコン ポーネン ト の 作 り 方

既存のコンポーネントに不

満があれば

Page 48: Flex カス タムコン ポーネン ト の 作 り 方

3

Page 49: Flex カス タムコン ポーネン ト の 作 り 方

カスタムコンポーネント開

Page 50: Flex カス タムコン ポーネン ト の 作 り 方

大きく分けて

3通りの方法

Page 51: Flex カス タムコン ポーネン ト の 作 り 方

1 既存コンポーネントの拡張

2 既存コンポーネントの再実装

3 新規コンポーネント

Page 52: Flex カス タムコン ポーネン ト の 作 り 方

1 既存コンポーネントの拡張既存コンポーネン

トを継承して

機能を追加

Page 53: Flex カス タムコン ポーネン ト の 作 り 方

コンポーネントのクラス階

Page 54: Flex カス タムコン ポーネン ト の 作 り 方

UIComponent

Button

ScrollControlBase

ListBase

Tree DataGrid

Page 55: Flex カス タムコン ポーネン ト の 作 り 方

UIComponent

ListBaseButton

Tree DataGrid

ScrollControlBase

MyTree

MyButton

Page 56: Flex カス タムコン ポーネン ト の 作 り 方

新たなプロパティやメソッドを

追加できる

Page 57: Flex カス タムコン ポーネン ト の 作 り 方

protected なメソッドやプロパティを使って色々できる

Page 58: Flex カス タムコン ポーネン ト の 作 り 方

super の前後に

コードを入れて色々できる

Page 59: Flex カス タムコン ポーネン ト の 作 り 方

もしも、継承では限界がある場合は

Page 60: Flex カス タムコン ポーネン ト の 作 り 方

つまり、

private にアクセス

したいときは

Page 61: Flex カス タムコン ポーネン ト の 作 り 方

2 既存コンポーネントの再実装

既存コンポーネントのソースをコピーして

一部書き換える

Page 62: Flex カス タムコン ポーネン ト の 作 り 方

UIComponent

ListBaseButton

Tree DataGrid

ScrollControlBase

MyTree

MyButton

コピー

コピー

Page 63: Flex カス タムコン ポーネン ト の 作 り 方

mx.controls.Button

のソースコードは

frameworks\source\mx\controls\Button.as

Page 64: Flex カス タムコン ポーネン ト の 作 り 方

mx.controls.Button

のソースコードは

frameworks\source\mx\controls\Button.as

(2,355 行 !!!)

Page 65: Flex カス タムコン ポーネン ト の 作 り 方

あまりお薦めしない

Page 66: Flex カス タムコン ポーネン ト の 作 り 方

ソースが煩雑になる

Page 67: Flex カス タムコン ポーネン ト の 作 り 方

ライセンス的に微妙

Page 68: Flex カス タムコン ポーネン ト の 作 り 方

開発は OKソース公開

NG詳しくは、、、 Flex SDKの「 license.htm 」をご覧ください

Page 69: Flex カス タムコン ポーネン ト の 作 り 方

23 新規コンポーネン

1からコンポーネントを

作る場合

Page 70: Flex カス タムコン ポーネン ト の 作 り 方

UIComponent

Button

ScrollControlBase

ListBase

Tree DataGrid

MyComp

UIComponent を継承する

Page 71: Flex カス タムコン ポーネン ト の 作 り 方

UIComponent って何?

Page 72: Flex カス タムコン ポーネン ト の 作 り 方

その前に、ありがちな

実装例

Page 73: Flex カス タムコン ポーネン ト の 作 り 方

円を描画するコンポーネン

Page 74: Flex カス タムコン ポーネン ト の 作 り 方

<mx:Application xmlns:mx="http://www..."

xmlns:comp="*"> <comp:Circle text="test" color="#ffffff" backgroundColor="#336699" width="100" height="100"/></mx:Panel>

使用例

Page 75: Flex カス タムコン ポーネン ト の 作 り 方

Package {import flash.text.*;import flash.events.Event;import mx.core.UIComponent;

public class Circle extends UIComponent {// テキストprivate var textField:TextField;

(つづく) }}

実装例 (1/6) – クラス定義

Page 76: Flex カス タムコン ポーネン ト の 作 り 方

/****** color プロパティ ******/ // 変数定義 private var _color:uint;

// getter public function get color():uint { return _color; }

// setter public function set color(value:uint):void { _color = value; dispatchEvent(new Event("colorChange")); }

実装例 (2/6) – プロパティ

Page 77: Flex カス タムコン ポーネン ト の 作 り 方

/****** backgroundColor プロパティ ******/ // 変数定義 private var _backgroundColor:uint;

// getter ・ setter は同様のため略

/****** text プロパティ ******/ // 変数定義 private var _text:String;

// getter ・ setter は同様のため略

実装例 (3/6) – プロパティ(cont.)

Page 78: Flex カス タムコン ポーネン ト の 作 り 方

// コンストラクタ public function Circle() { // TextField 作成 textField = new TextField(); addChild(textField);

// イベント登録 addEventListener("colorChange", colorChangeHandler); addEventListener("backgroundColorChange",

bgColorChangeHandler); addEventListener("textChange", textChangeHandler); }

実装例 (4/6) – コンストラクタ

Page 79: Flex カス タムコン ポーネン ト の 作 り 方

private function colorChangeHandler(event:Event):void { render(); }

private function bgColorChangeHandler(event:Event):void { render(); }

private function textChangeHandler(event:Event):void { render(); }

実装例 (5/6) – イベントハンドラ

Page 80: Flex カス タムコン ポーネン ト の 作 り 方

// 描画処理 private function render():void { graphics.clear(); graphics.beginFill(backgroundColor); graphics.drawEllipse(0, 0, unscaledWidth, unscaledHeight); graphics.endFill();

var tf:TextFormat = textField.getTextFormat(); tf.color = color; tf.size = 30; textField.defaultTextFormat = tf; textField.text = text ? text : ""; }

実装例 (6/6) – 描画処理

Page 81: Flex カス タムコン ポーネン ト の 作 り 方

できた!

Page 82: Flex カス タムコン ポーネン ト の 作 り 方

問題点

Page 83: Flex カス タムコン ポーネン ト の 作 り 方

イベント処理が煩雑

Page 84: Flex カス タムコン ポーネン ト の 作 り 方

プロパティの数だけ

イベントハンドラが増える

Page 85: Flex カス タムコン ポーネン ト の 作 り 方

パフォーマンスの問題

Page 86: Flex カス タムコン ポーネン ト の 作 り 方

circle.text = "hoge";circle.color = 0xffff00;circle.backgroundColor = 0xff0000;

このコードは描画処理が3回走る

Page 87: Flex カス タムコン ポーネン ト の 作 り 方

UIComponentで解決!

Page 88: Flex カス タムコン ポーネン ト の 作 り 方

無効化メソッドの活用

Page 89: Flex カス タムコン ポーネン ト の 作 り 方

// setter public function set color(value:uint):void { _color = value; dispatchEvent(new Event("colorChange")); invalidateDisplayList(); }

setter で無効化メソッドを呼

Page 90: Flex カス タムコン ポーネン ト の 作 り 方

次の画面更新で描画処理が

行われる

invalidateDisplayList()

Page 91: Flex カス タムコン ポーネン ト の 作 り 方

addEventListenerとイベントハンドラは、いらないの

で削除

Page 92: Flex カス タムコン ポーネン ト の 作 り 方

override protected function updateDisplayList(w:Number, h:Number):void {

super.updateDisplayList(w, h); // 忘れずに !! render();}

updateDisplayListで描画する

Page 93: Flex カス タムコン ポーネン ト の 作 り 方

1度でも無効化されると、次の画面更新

でFlex システムが

呼び出すメソッド

updateDisplayList()

Page 94: Flex カス タムコン ポーネン ト の 作 り 方

circle.text = "hoge";circle.color = 0xffff00;circle.backgroundColor = 0xff0000;

3回 invalidate されるが

描画処理は1回だけ

Page 95: Flex カス タムコン ポーネン ト の 作 り 方

(補足)無効化メソッ

ド3種類

Page 96: Flex カス タムコン ポーネン ト の 作 り 方

1. 描画処理invalidateDisplayList

↓updateDisplayList

Page 97: Flex カス タムコン ポーネン ト の 作 り 方

2. サイズ処理

invalidateSize↓

measure

Page 98: Flex カス タムコン ポーネン ト の 作 り 方

3. プロパティ変更処理

invalidateProperties

↓commitProperties

Page 99: Flex カス タムコン ポーネン ト の 作 り 方

さらにチューニング

Page 100: Flex カス タムコン ポーネン ト の 作 り 方

// change フラグ private var colorChanged:Boolean = false;

// setter public function set color(value:uint):void { _color = value; colorChanged = true;

dispatchEvent(new Event("colorChange")); invalidateDisplayList(); }

changed フラグを導入

Page 101: Flex カス タムコン ポーネン ト の 作 り 方

// 描画処理 private function render():void { // ( 略 )

if(colorChanged) { colorChanged = false;

var tf:TextFormat = textField.getTextFormat(); tf.color = color; tf.size = 30; textField.defaultTextFormat = tf; }

textField.text = text ? text : ""; }

changed フラグが true のときのみ描画に反映

Page 102: Flex カス タムコン ポーネン ト の 作 り 方

// 描画処理 private function render():void { // ( 略 )

if(colorChanged) { colorChanged = false;

var tf:TextFormat = textField.getTextFormat(); tf.color = color; tf.size = 30; textField.defaultTextFormat = tf; }

textField.text = text ? text : ""; }

changed フラグが true のときのみ描画に反映

この部分が重い処理の場合に速度が向上する

Page 103: Flex カス タムコン ポーネン ト の 作 り 方

さらにさらに

チューニング

Page 104: Flex カス タムコン ポーネン ト の 作 り 方

// コンストラクタpublic function Circle() { // TextField 作成 textField = new TextField(); addChild(textField);}

コンストラクタで子を作成するのをやめる

Page 105: Flex カス タムコン ポーネン ト の 作 り 方

// コンストラクタpublic function Circle() {}

override protected function createChildren(){ super.createChildren();

// TextField 作成 textField = new TextField(); addChild(textField);}

コンストラクタで子を作成するのをやめる

Page 106: Flex カス タムコン ポーネン ト の 作 り 方

createChildren() は addChild されたとき

にFlex が呼ぶメソッド

Page 107: Flex カス タムコン ポーネン ト の 作 り 方

new だけされてaddChild されない場合、

パフォーマンスが向上するだけでなく

Page 108: Flex カス タムコン ポーネン ト の 作 り 方

初期化のコードをcreateChildren() に

集約できる

Page 109: Flex カス タムコン ポーネン ト の 作 り 方

無効化メソッド・ createChildr

enの嬉しいところ

Page 110: Flex カス タムコン ポーネン ト の 作 り 方

コーディングは

煩雑になるが多少

Page 111: Flex カス タムコン ポーネン ト の 作 り 方

書く場所が一意に定まる

Page 112: Flex カス タムコン ポーネン ト の 作 り 方

スパゲッティになりがちなUI をすっきり

書ける

Page 113: Flex カス タムコン ポーネン ト の 作 り 方

UIComponentこそが

Flex の肝

Page 114: Flex カス タムコン ポーネン ト の 作 り 方

UIComponentは

フレームワークだ

Page 115: Flex カス タムコン ポーネン ト の 作 り 方

4

Page 116: Flex カス タムコン ポーネン ト の 作 り 方

まとめ

Page 117: Flex カス タムコン ポーネン ト の 作 り 方

• 基本は標準コンポーネントを使う

• 不満があれば継承して拡張する• どこにもなければ、 UICompon

ent を継承して、1から作る

Page 118: Flex カス タムコン ポーネン ト の 作 り 方

参考資料

• Flex コンポーネントの作成と拡張flex2_createextendcomponents.pdf

• 前回よりは成長したブログhttp://d.hatena.ne.jp/s-ohira/