Presentation is loading. Please wait.

Presentation is loading. Please wait.

Flex カス タムコン ポーネン ト の 作 り 方 ( 有 )CO-CONV 最田 健一. 自己紹介.

Similar presentations


Presentation on theme: "Flex カス タムコン ポーネン ト の 作 り 方 ( 有 )CO-CONV 最田 健一. 自己紹介."— Presentation transcript:

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

2 自己紹介

3 にとよん という名前でブログやってま す http://tech.nitoyon.com/

4 Agenda 1.Flex 概要 2. 非カスタムコンポーネント な開発 3. カスタムコンポーネント開 発 4. まとめ

5

6 Flex 概要

7 Flash と ActionScript がベース

8 しかし

9 タイムライン が

10 ない

11 プログ ラマ用

12 Flash やっ てた人よ り

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

14 特徴

15 豊富な GUI パーツ

16

17 XML で 配置

18 具体例

19 具体例

20 具体例

21 具体例

22 具体例

23 流行し 始め

24 Anywhere.FM http://www.anywhere.fm/player/ http://www.anywhere.fm/player/

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

26 Google Analytics AIR beta ※ これは AIR だが UI は Flex で作られている

27 弊社某案件

28 2

29 非カスタ ムコン ポーネン トな開発

30 鉄則

31 可能な限り 既存のコン ポーネント を使おう

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

33

34

35

36 複合コンポーネント化

37

38 DateRange.mxml

39 利点

40 構造が すっきり

41 実装の 責任範囲 が明確に

42 再利用性 UP

43 注意点

44 大きなクラスも問題だ が

45 分けすぎにも注意

46 バランスが大事

47 既存のコン ポーネントに 不満があれば

48 3

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

50 大きく分け て 3通りの方 法

51 1 既存コンポーネント の 拡張 2 既存コンポーネント の 再実装 3 新規コンポーネン ト

52 1 既存コンポーネント の 拡張 既存コンポーネン トを 継承 して 機能を追加

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

54 UIComponent Button ScrollControlBase ListBase Tree DataGrid

55 UIComponent ListBase Button Tree DataGrid ScrollControlBase MyTree MyButton

56 新たなプロパ ティ や メソッド を 追加 できる

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

58 super の 前後に コードを入れ て色々できる

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

60 つまり、 private にアクセス したいときは

61 2 既存コンポーネント の 再実装 既存コンポーネントの ソースをコピーして 一部書き換える

62 UIComponent ListBase Button Tree DataGrid ScrollControlBase MyTree MyButton コピー

63 mx.controls.Button のソースコードは frameworks\source\mx\ controls\Button.as

64 mx.controls.Button のソースコードは frameworks\source\mx\ controls\Button.as ( 2,355 行 !!! )

65 あまりお薦め しない

66 ソースが 煩雑になる

67 ライセンス 的 に 微妙

68 開発 は OK ソース公開 NG 詳しくは、、、 Flex SDK の 「 license.htm 」をご覧くだ さい

69 2 3 新規コンポーネン ト 1からコンポーネン トを 作る場合

70 UIComponent Button ScrollControlBase ListBase Tree DataGrid MyComp UIComponent を 継承する

71 UIComponent って何?

72 その前に、 ありがちな 実装例

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

74 <mx:Application xmlns:mx="http://www..." xmlns:comp="*"> <comp:Circle text="test" color="#ffffff" backgroundColor="#336699" width="100" height="100"/> 使用例

75 Package { import flash.text.*; import flash.events.Event; import mx.core.UIComponent; public class Circle extends UIComponent{ // テキスト private var textField:TextField; (つづく) } 実装例 (1/6) – クラス定義

76 /****** 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) – プロパティ

77 /****** backgroundColor プロパティ ******/ // 変数定義 private var _backgroundColor:uint; // getter ・ setter は同様のため略 /****** text プロパティ ******/ // 変数定義 private var _text:String; // getter ・ setter は同様のため略 実装例 (3/6) – プロパティ (cont.)

78 // コンストラクタ public function Circle() { // TextField 作成 textField = new TextField(); addChild(textField); // イベント登録 addEventListener("colorChange", colorChangeHandler); addEventListener("backgroundColorChange", bgColorChangeHandler); addEventListener("textChange", textChangeHandler); } 実装例 (4/6) – コンストラクタ

79 private function colorChangeHandler(event:Event):void { render(); } private function bgColorChangeHandler(event:Event):void { render(); } private function textChangeHandler(event:Event):void { render(); } 実装例 (5/6) – イベントハンド ラ

80 // 描画処理 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) – 描画処理

81 できた!

82 問題点

83 イベント処 理が煩雑

84 プロパティの数だ け イベントハン ドラ が増える

85 パフォーマ ンスの問題

86 circle.text = " hoge " ; circle.color = 0xffff00; circle.backgroundColor = 0xff0000; このコードは 描画処理が3回走る

87 UIComponent で解決!

88 無効化メソッ ドの活用

89 // setter public function set color(value:uint):void { _color = value; dispatchEvent(new Event("colorChange")); invalidateDisplayList(); } setter で 無効化メソッドを呼 ぶ

90 次の画面更新で 描画処理が 行われる invalidateDisplayList()

91 addEventListener と イベントハンド ラ は、 いらないの で削除

92 override protected function updateDisplayList(w:Number, h:Number):void { super.updateDisplayList(w, h); // 忘れずに !! render(); } updateDisplayList で描画する

93 1度でも無効化され ると、次の画面更新 で Flex システムが 呼び出すメソッド updateDisplayList()

94 circle.text = " hoge " ; circle.color = 0xffff00; circle.backgroundColor = 0xff0000; 3回 invalidate される が 描画処理は1回だけ

95 (補足) 無効化メソッ ド3種類

96 1. 描画処理 invalidateDisplayList ↓ updateDisplayList

97 2. サイズ処 理 invalidateSize ↓ measure

98 3. プロパティ変更処 理 invalidateProperties ↓ commitProperties

99 さらに チューニング

100 // change フラグ private var colorChanged:Boolean = false; // setter public function set color(value:uint):void { _color = value; colorChanged = true; dispatchEvent(new Event("colorChange")); invalidateDisplayList(); } changed フラグを導入

101 // 描画処理 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 のとき のみ描画に反映

102 // 描画処理 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 のとき のみ描画に反映 この部分が重い処理の場合に 速度が向上する

103 さらに さらに チューニング

104 // コンストラクタ public function Circle() { // TextField 作成 textField = new TextField(); addChild(textField); } コンストラクタで 子を作成するのをやめる

105 // コンストラクタ public function Circle() { } override protected function createChildren(){ super.createChildren(); // TextField 作成 textField = new TextField(); addChild(textField); } コンストラクタで 子を作成するのをやめる

106 createChildren() は addChild されたとき に Flex が呼ぶメソッド

107 new だけされて addChild されない場合、 パフォーマンスが向上 するだけでなく

108 初期化のコードを createChildren() に 集約 できる

109 無効化メソッド・ createChildren の嬉しいところ

110 コーディング は 煩雑になるが 多少

111 書く場所が 一意に定まる

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

113 UIComponent こそが Flex の 肝

114 UIComponent は フレームワーク だ

115 4

116 まと め

117 基本は標準コンポーネントを使 う 不満があれば継承して拡張する どこにもなければ、 UIComponent を継承して、1か ら作る

118 参考資料 Flex コンポーネントの作成と拡張 flex2_createextendcomponents.pdf 前回よりは成長したブログ http://d.hatena.ne.jp/s-ohira/


Download ppt "Flex カス タムコン ポーネン ト の 作 り 方 ( 有 )CO-CONV 最田 健一. 自己紹介."

Similar presentations


Ads by Google