Android公式開発ドキュメントTrainingシリーズ中国語版:カスタムViewの作成


原文住所:http://android.xsoftlab.net/training/custom-views/index.html
引用する
Androidフレームワークには、さまざまなデータを表示し、ユーザーと直接対話できる多くのViewクラスが含まれています.しかし、APPには特別なニーズがある場合がありますが、フレームワークのViewはまだこのようなニーズを満たすことができません.この場合、必要に応じて新しいViewクラスを作成する必要があります.このコースでは、このようなカスタムViewの作成方法について学習します.
Viewクラスの作成
デザインの良いカスタムViewは、他のデザインの良いViewクラスと似ています.一連の特殊な機能をカプセル化し、簡単で使いやすいインタフェースを暴露しました.CPUやメモリなどのリソースを効率的かつ合理的に使用しています.これらの機能に加えて、カスタムViewは次のような機能が必要です.
  • はAndroid規格に準拠しています.
  • は、Android XMLレイアウトで動作するカスタムスタイルプロパティを提供します.
  • は、アクセス可能なイベントを送信する.
  • Androidプラットフォームの互換性.

  • Androidフレームワークは、上記の基準に合致するViewの作成を支援する一連の基礎クラスとXMLラベルを提供しています.このレッスンでは、Androidフレームワークを使用してカスタムViewのコア機能を作成する方法を学びます.
    Viewのサブクラスの作成
    AndroidのすべてのViewクラスはViewに継承されています.カスタムViewは、Viewを直接継承したり、ButtonなどのViewサブクラスを継承したりすることができます.
    Android Developer ToolsがあなたのViewとインタラクティブになるように、ContextとAttributeSetをパラメータとして含む少なくとも1つの構築方法を提供する必要があります.この方法では、レイアウトエディタ(Layout Editor)でViewのインスタンスを作成または編集できます.
    class PieChart extends View {
        public PieChart(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    }

    カスタム属性の定義
    UIにViewを追加する場合は、XML要素としてそのViewを指定し、エレメント属性でViewの動作と外観を制御する必要があります.定義の良いカスタムViewは、XMLでこれらのスタイルを追加、設計することもできます.カスタムビューに次のような動作を持たせるには、次の手順に従います.
  • リソース要素でカスタムViewのプロパティを定義します.
  • XMLレイアウトで属性の値を指定します.
  • は、実行時に属性値を受信する.
  • は、受信した属性値をViewに適用する.

  • このセクションでは、プロパティの定義方法と値の指定方法について説明します.次のセクションでは、実行時に受信値をどのように処理して使用するかを学習します.
    カスタムプロパティを定義するには、プロジェクトにリソースを追加する必要があります.通常、これらのリソースはres/values/attrs.xmlファイルに配置されます.次に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>

    上のコードは、PieChartというスタイルエンティティに属する2つのカスタムプロパティ、showTextとlabelPositionを宣言しています.スタイルエンティティの名前は、対応するカスタムViewのクラス名と慣例に従って一致します.この慣例に従う必要はありませんが、多くの人気のあるコード編集者は、この命名慣例に従って実装宣言を提供するのが好きです.
    カスタムプロパティを定義すると、組み込みプロパティのようにXMLファイルで使用できます.唯一の違いは、カスタムプロパティが異なるネーミングスペースに属することです.標準ではありませんhttp://schemas.android.com/apk/res/androidネーミングスペースhttp://schemas.android.com/apk/res/[your package name].たとえば、カスタムアトリビュートを使用する方法の例を示します.
    <?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>

    名前空間の繰り返し定義を避けるために、例ではxmlsコマンドが使用されます.この指定はhttp://schemas.android.com/apk/res/com.example.customviewsネーミングスペースはcustomエイリアスに関連付けられています.ネーミングスペースに使用したい名前を使用することができます.
    なお、ここでレイアウトで参照するカスタムViewは、カスタムViewの権限名を採用しています.Viewクラスが内部クラスである場合、外部クラスのクラス名でさらに限定する必要があります.たとえば、PieChartにはPieViewという内部クラスが含まれています.このクラスのカスタムプロパティを使用する場合は、ラベル:com.example.customviews.charting.PieChart$PieViewを使用します.
    カスタム属性の適用
    XMLレイアウトから1つのViewが作成されると、XMLラベルのすべてのプロパティが読み込まれ、Viewの構築方法によってAttributeSetとしてViewに渡されます.AttributeSetから直接データを読み込む可能性がありますが、いくつかの欠点があります.
  • リソースが参照する属性値は解析できない
  • .
  • Style
  • はサポートされていません
    逆に、AttributeSetをobtainStyledAttributes()メソッドに渡すことができる.このメソッドは、間接的に参照される配列値を含むTypedArrayオブジェクトを返します.
    Androidリソースコンパイラは、obtainStyledAttributes()メソッドをより簡単に使用するために多くの作業を行いました.リソースディレクトリ内の各リソースは、R.javaで対応するプロパティidを定義します.この定義された定数を使用して、TypedArrayでプロパティを読み込むことができます.次に、PieChartクラスがプロパティを読み込む方法の例を示します.
    public PieChart(Context context, AttributeSet attrs) {
       super(context, 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();
       }
    }

    注意TypedArrayは共有リソースであり、使用後に回収する必要があります.
    属性とイベントの追加
    AttributesはViewの外観と動作を制御する強力な方法ですが、Viewが初期化されたときにのみ読み込まれます.動的な動作を提供する場合は、対応するget、setメソッドを暴露する必要があります.次のコードは、PieChartがshowTextという属性メソッドをどのように暴露したかを示しています.
    public boolean isShowText() {
       return mShowText;
    }
    public void setShowText(boolean showText) {
       mShowText = showText;
       invalidate();
       requestLayout();
    }

    注意setShowTextではinvalidate()メソッドとrequestLayout()メソッドが呼び出されます.これらの方法は、Viewの動作変更が有効であることを保証します.完了したアトリビュートを変更した後、ビューの外観を有効にするには、ビューを再描画する必要があります.これにより、ビューが再描画される必要があることがわかります.同様に、新しいアトリビュート値が寸法またはシェイプの変更を引き起こす可能性がある場合は、新しいレイアウトを要求する必要があります.これらの方法を呼び出すのを忘れると発見しにくいBugを引き起こす.
    カスタムViewはまた、重要なイベントと対話するためにイベントリスナーをサポートする必要があります.たとえば、PieChartはOnCurrentItemChangedというカスタムイベントを暴露し、リスナーユーザーに円グラフの回転を通知します.
    プロパティとイベントの暴露は忘れがちですが、特にあなたは唯一のカスタムViewのユーザーです.Viewインタフェースを定義するときに、将来のメンテナンスに時間と労力を費やすことができます.良い習慣は、常にメンバーのプロパティの外観と動作を露出するプロパティ方法です.
    アクセス性
    カスタムViewは、より広範なユーザーをサポートする必要があります.視力に欠陥のある障害者も含まれている.このユーザーの使用をサポートするには、次の手順に従います.
  • android:contentDescriptionプロパティを使用して、入力フィールド
  • を識別します.
  • は、sendAccessibilityEvent()メソッドを介してアクセス可能なイベント
  • を適切に送信する.
  • は、D-padやトラックボール
  • など、より多くのコントローラをサポートしています.
    詳細については、Making Applications Accessibleを参照してください.