カスタムビューを作る
メインページ>コンピュータの部屋#Android>Android Tips
Android には標準で Button や TextView や LinearLayout など、多数のビューを利用できますが、ビューを自作することもできます。
以下に楕円を表示するだけの簡単なビューの実装例を示します。
モジュールを作成する
AndroidStudio で作成する場合は、専用の Android Library Module を新規に作るのがよいでしょう。
カスタム属性を定義する
モジュールに res/values/attr.xml というファイルを作り、カスタム属性を定義します。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Ellipse">
<attr name="strokeColor" format="color"/>
<attr name="strokeWidth" format="dimension"/>
</declare-styleable>
</resources>
strokeColor は楕円の輪郭の色、strokeWidth は楕円の輪郭の太さです。
カスタムビューのクラスを作成する
カスタムビューのクラスを View クラスを継承して作成します。名前は Ellipse としましょう。
class Ellipse extends View {
// 輪郭色。既定値は赤
private int mStrokeColor = Color.RED;
// 輪郭幅。
private float mStrokeWidth;
// 楕円のサイズ
private final RectF rect = new RectF();
// 描画用Paint
private final Paint mPaint = new Paint();
:
:
}
コンストラクタを書く
コンストラクタは2種類必要です。
public Ellipse(Context context) {
this(context, null);
}
public Ellipse(Context context, AttributeSet attrs) {
super(context, attrs);
// 160dpiとの比を求める。
float mDensity = getContext().getResources().getDisplayMetrics().density;
// 線幅を既定値 2dp に。
mStrokeWidth = (int) (mDensity * 2);
if (attrs == null) {
return;
}
// 楕円の属性を取得
TypedArray tArray = context.obtainStyledAttributes(attrs, R.styleable.Ellipse);
try {
// 色と高さを設定
mStrokeColor = tArray.getColor(R.styleable.Ellipse_strokeColor, mStrokeColor);
mStrokeWidth = tArray.getDimensionPixelSize(R.styleable.Ellipse_strokeWidth, mStrokeWidth);
} finally {
tArray.recycle();
}
}
XMLで指定されたカスタムアトリビュートは AttributeSet attrs という引数で入力されてきますが、そのまま使ってはいけません。 コンテキストのobtainStyledAttributesメソッドで TypedArray 型に変換してください。これで属性はテーマやスタイルが反映された正しい値になります。
カスタム属性は TypedArray の getColorメソッドなどに、R.styleable に自動生成された識別子を指定して値を取り出します。 カスタム属性値がない場合、getColorなどのメソッドの最後のパラメータが既定値として戻るのに注意してください。従って mStrokeWidthやmStrokeColorは予め規定値で初期化しておく必要があります。
カスタム属性の setter/getter を用意する
XMLで設定できる属性は通常コードからも動的に設定できるようにします。
以下、鋭意作成中