AndroidカスタムView手順


転載先:http://www.cnblogs.com/purediy/p/3799534.html
1良好なカスタムビュー
使いやすい、標準的、開放的.
デザインの良いカスタムviewは、他のデザインの良いクラスに似ています.CPUとメモリを効率的に使用でき、非常に開放的な使いやすさのあるインタフェースを備えた機能の組み合わせがパッケージされています.ただし、デザインの良いクラスを開始する以外は、カスタムviewは次のようにします.
lアンドロイド規格に適合
l Android XMLレイアウトで動作可能なカスタムスタイル属性を提供
lアクセス可能なイベントの送信
l複数のAndroidプラットフォームと互換性があります.
Androidフレームワークには、これらの要件を満たす新しいviewを作成するための基本的なクラスとXMLラベルが用意されています.プロパティとイベントを指定するのを忘れるのは簡単です.特に、このカスタムviewの唯一のユーザーである場合です.viewのインタフェースを細かく定義して、将来のメンテナンスにかかる時間を減らしてください.従うべきガイドラインの1つは、viewで表示される外観に影響を与えるすべてのプロパティまたは動作を暴露することです.
2カスタムViewの作成(手順)
2.1 Viewを完全にカスタマイズまたは継承する派生子クラスの継承
Contextと属性としてAttributeSetオブジェクトを取得できるコンストラクション関数を指定し、viewがXMLレイアウトから作成されると、XMLラベルのすべての属性がリソースパッケージから読み出され、viewに渡されるコンストラクション関数の数を取得する必要があります.
View派生の直接または間接サブクラス:ImageView,Button,CheckBox,Surface View,TextView,ViewGroup,AbsListView
ViewGourpから派生した直接または間接サブクラス:AbsoluteLayout,FrameLayout,RelativeLayout,LinearLayout
すべてのベースクラス、派生クラスはAndroid framework層に統合された標準システムクラスであり、SDKのこれらのシステムクラスとそのAPIを直接参照することができる.
2.2カスタム属性の定義
lリソース要素でviewのカスタムプロパティを定義します.
プロジェクトグループにリソースを追加します.これらのリソースは通常res/values/attrs.xmファイルに格納されます.attrs.xmlファイルの例を次に示します.
<resources>;

   <declare-styleable name="PieChart">

       <attr name="showText" format="boolean" />

       <attr name="labelPosition" format="enum">

           <enum name="left" value="0"/>

           <enum name="right" value="1"/>

       </attr>

   </declare-styleable>

</resources>

l指定した属性の値をXMLレイアウトで使用します.
レイアウトXMLファイルでは、組み込み属性のように使用できます.唯一の違いは、カスタムプロパティが異なるネーミングスペースに属することです.
http://schemas.android.com/apk/res/[あなたのカスタムビューが存在するパッケージパス]
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:custom="http://schemas.android.com/apk/res/com.example.customviews">

<com.example.customviews.charting.PieChart

custom:showText="true"

custom:labelPosition="left" />

</LinearLayout>

l運転時に属性値を取得する.
l取り戻した属性値をviewに適用します.
2.3カスタム属性の取得
ビューがXMLレイアウトから作成されると、XMLラベルのすべてのプロパティがリソースパッケージから読み込まれ、ビューのコンストラクション関数にAttributeSetとして渡されます.AttributeSetから値を直接読み込むことは可能ですが、いくつかの欠点があります.
l値付きリソースリファレンスは処理されていません
lスタイルは許可されていません
代わりに、AttributeSetをobtainStyledAttributes()メソッドに渡す.この方法はTypedArray配列に戻され,参照が解除され,スタイル化された値が含まれている.
Androidリソースコンパイラは、obtainStyledAttributes()メソッドを容易に呼び出すために多くの作業を行いました.resフォルダ内の各リソースは、生成されたR.javaが属性IDの配列を定義し、配列内の各属性を指す定数を定義します.定義済み定数を使用して、TypedArryから属性を読み込むことができます.次の例では、PieChartクラスがこれらのプロパティを読み込む方法を示します.
public PieChart(Context ctx, AttributeSet attrs) {

super(ctx, attrs);

TypedArray a = context.getTheme().obtainStyledAttributes(

attrs,

R.styleable.PieChart,

0, 0);

try {

mShowText = a.getBoolean(R.styleable.PieChart_showText, false);

mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);

} finally {

a.recycle();

}

}

TypedArryオブジェクトは共有リソースであり、使用済みの場合は回収する必要があります.
2.4属性とイベントの追加
プロパティはviewの動作と外観を制御する強力な方法ですが、viewが初期化された後にこれらのプロパティだけが読めます.動的な動作を提供するには、各カスタム属性のgetterとsetterのペアを露出する必要があります.次のコードクリップは、PieChartがshowTextプロパティをどのように提供するかを示します.
public boolean isShowText() {

return mShowText;

}

public void setShowText(boolean showText) {

mShowText = showText;

invalidate();

requestLayout();

}

setShowTextはinvalidate()とrequestLayout()を呼び出します.これらの呼び出しの鍵はview動作が信頼できることを保証するためである.外観を変える可能性のある属性を変更した後、このviewを廃止しなければなりません.そうすれば、システムは再描画が必要であることを知ることができます.同様に、プロパティの変化が寸法やviewの形状に影響を及ぼす可能性がある場合は、新しいレイアウトを要求する必要があります.これらのメソッドを呼び出すのを忘れると、探しにくいバグになる可能性があります.
カスタムviewでは、重要なイベントとのコミュニケーションをサポートするイベントリスナーも必要です.
2.5カスタムペイント(実装)
カスタムビューを描く上で最も重要なステップはonDraw()を書き換える方法です.onDraw()のパラメータはビューが自分のCanvasオブジェクトを描くために使用することができます.Canvasはテキスト、線、ビットマップ、その他の画像ユニットを描くために定義します.onDraw()でこれらの方法を使用してカスタムユーザーインタフェース(UI)を作成することができます.
Android.graphicsフレームワークは図面を2つの部分に分けています.
l何を描きますか、Canvasで処理します
lどのように描くかは、ペイントで処理します
例えば、Canvasは線を描く方法を提供し、Paintは線の色を定義する方法を提供する.Canvasは矩形を描く方法を提供し、Paintは矩形を色で塗りつぶすか、空にするかを定義する.簡単に言えば、Canvasは画面に描くことができる形状を定義し、Paintはあなたが描いた各形状に色、スタイル、フォントなどを定義する.
onDraw()は3 dグラフィックapiのサポートを提供していません.3 dグラフィックスサポートが必要な場合は、ViewではなくSurface Viewを継承し、個別のスレッドで図面を描く必要があります.
3最適化
3.1リフレッシュ頻度の低減
viewの実行速度を向上させるために,頻繁に呼び出されるプログラムからの不要なコードを低減する.onDraw()メソッドから呼び出すと、最高のリターンが得られます.特に、onDraw()メソッドでは冗長コードを減らす必要があります.冗長コードはviewの一貫性のないゴミ回収をもたらします.初期化された冗長オブジェクト、またはアニメーション間では、アニメーションの実行時には、いつまでも貢献しません.
さらにonDraw()メソッドの依存性を高めるためには、できるだけ頻繁に呼び出さないようにする必要があります.ほとんどの場合、onDraw()メソッドを呼び出すとinvalidate()を呼び出す結果になるので、不要なinvalidate()メソッドを減らすことができます.可能性があるのは、パラメータのないバージョンを呼び出すのではなく、4つのパラメータの異なるタイプのinvalidate()を呼び出すことです.パラメトリック変数なしでview全体をリフレッシュする必要がありますが、4つのパラメータタイプの変数は指定された部分のviewをリフレッシュするだけです.この効率的な呼び出しは需要に近づき、矩形画面の外に落ちる不要なリフレッシュページを減らすことができます.
3.2ハードウェアアクセラレータの使用
Android 3.0として、Android 2 Dグラフシステムは、ほとんどの新しいAndroid装置にGPU(グラフ処理ユニット)を搭載することで増加することができ、多くのアプリケーションにとってGPUハードウェアの加速度は大きな性能増加をもたらすが、アプリケーションごとに正しい選択ではない.Androidフレームワーク層は、アプリケーションのハードウェアの一部が増加しているかどうかを制御する能力をよりよく提供します.
アプリケーション、アクティビティ、またはフォームレベルで加速度クラスを使用する方法については、Android開発者ガイドのHardware Accelerationクラスを参照してください.開発者ガイドの追加の説明に注意すると、Android Manifest.xmlファイルのでアプリケーションターゲットAPIを11以上のレベルに設定する必要があります.
ハードウェア加速度クラスを使用すると、パフォーマンスの増加が見られない可能性があります.携帯電話GPUsは、測定、反転、シフトマップクラスの画像など、いくつかのタスクが得意です.特に、直線や曲線を描くなど、他のタスクは苦手です.GPU加速度クラスを利用するには、GPUの得意な操作数を増やし、GPUの苦手な操作数を減らす必要があります.