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

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
Genius Framework について 吉津 卓保( S2 ファクトリー株式会社). 自己紹介.
AIプログラミング Java とオブジェクト指向プログラミングの基 礎 認知システム論 情報工学コース コンピュータサイエンスコース 生体情報コース.
Scala + Lift フレームワーク. Scala の概要 JVM 上で動作するオブジェクト指向+関数型言 語 JVM のスケーラビリティを適用できる Java との相互利用が可能 trait を利用した多重継承( Mix-In )が可能.
Scala + Liftフレームワーク その2.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
社会人学習講座 「Javaプログラミング概論」
GridLayout オブジェクト(省略)
最近の気になるネタ presented by Kei-z.
Flex “30分でわかるFlex”.
Imageの描画 画像を読み込んで表示すること。 import java.awt.*;が必要。
Applet 岡部 祐典 鈴木 敬幸.
Javaのための暗黙的に型定義される構造体
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
C#によるWindowsFormApplication入門
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
コンポーネントの再利用に必要な情報 えムナウ (児玉宏之)
JSFによるWebアプリケーション開発 第11回
Javaのインタフェース についての補足 2006年5月17日 海谷 治彦.
プログラミング演習3 第4回 ミニプロジェクト.
MSBuild 色々出来るよ 2011/04/02 お だ.
JavaBeans とJSP データベース論 第5回.
JSFによるWebアプリケーション開発 第6回
PHPの基礎と開発手法 Based on PHP5
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
プログラミング演習3 第2回 GUIの復習.
~手続き指向からオブジェクト指向へ[Ⅱ]~
第12回 2007年7月13日 応用Java (Java/XML).
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング演習3 第3回 ミニプロジェクト.
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
第11回 2007年7月6日 応用Java (Java/XML).
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
プログラミング演習3 第3回 ミニプロジェクト.
静的型付きオブジェクト指向言語 のための 暗黙的に型定義されるレコード
暗黙的に型付けされる構造体の Java言語への導入
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
Windows PowerShell Cmdlet
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
プログラミング演習3 第2回 GUIの復習.
10-1 SAXの概要 10-2 Saxプログラミングの基礎 10-3 saxのプログラム例
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
Java/Swingについて+ (4) 2005年10月26日 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
もっと詳しくArrayクラスについて調べるには → キーワード検索
パッケージ,アクセス修飾子 2008年4月27日 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
Javaによる Webアプリケーション入門 第4回
ソフトウェア制作論 平成30年11月28日.
統合開発環境のための プログラミング言語拡張 フレームワーク
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
フレンド関数とフレンド演算子.
コードクローン解析に基づく デザインパターン適用候補の検出手法
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
5.基本API 5-1 レイアウト ウィジェットの並べ方を指定するには、 パレットのレイアウト(Layoutでは以下の8種類)を配置する。
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

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

自己紹介

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

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

Flex 概要

Flash と ActionScript がベース

しかし

タイムライン が

ない

プログ ラマ用

Flash やっ てた人よ り

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

特徴

豊富な GUI パーツ

XML で 配置

具体例

具体例

具体例

具体例

具体例

流行し 始め

Anywhere.FM

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

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

弊社某案件

2

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

鉄則

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

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

複合コンポーネント化

DateRange.mxml

利点

構造が すっきり

実装の 責任範囲 が明確に

再利用性 UP

注意点

大きなクラスも問題だ が

分けすぎにも注意

バランスが大事

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

3

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

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

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

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

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

UIComponent Button ScrollControlBase ListBase Tree DataGrid

UIComponent ListBase Button Tree DataGrid ScrollControlBase MyTree MyButton

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

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

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

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

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

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

UIComponent ListBase Button Tree DataGrid ScrollControlBase MyTree MyButton コピー

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

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

あまりお薦め しない

ソースが 煩雑になる

ライセンス 的 に 微妙

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

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

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

UIComponent って何?

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

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

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

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

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

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

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

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

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

できた!

問題点

イベント処 理が煩雑

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

パフォーマ ンスの問題

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

UIComponent で解決!

無効化メソッ ドの活用

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

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

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

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

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

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

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

1. 描画処理 invalidateDisplayList ↓ updateDisplayList

2. サイズ処 理 invalidateSize ↓ measure

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

さらに チューニング

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

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

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

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

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

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

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

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

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

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

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

書く場所が 一意に定まる

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

UIComponent こそが Flex の 肝

UIComponent は フレームワーク だ

4

まと め

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

参考資料 Flex コンポーネントの作成と拡張 flex2_createextendcomponents.pdf 前回よりは成長したブログ