Android:stateに応じて切り替わるdrawable・・・StateListDrawable

Androidでは、pressやfocus等のstatement別にdrawableを指定するdrawableが作成可能だ。
xmlでは<selector>で指定を行う。

ところで、こういったリソースをxmlで書くのは非常にしんどいので事ある毎にコードで実装しているのだが、<selector>を自前で実装する方法を研究してみた。


それを実現するのは、StateListDrawableというDrawableだ。

下記は、StateListDrawableをButtonの背景色に適用するサンプル。

Button btn = new Button( context );

Drawable tomei = new ColorDrawable( Color.argb(0,0,0,0) );
Drawable tap   = new ColorDrawable( Color.argb(0xff,0xff,0,0) );
Drawable normal= new ColorDrawable( Color.argb(0xff,0,0xff,0) );

StateListDrawable d = new StateListDrawable();
d.addState( new int[]{ android.R.attr.state_pressed }, tap );
d.addState( new int[]{ android.R.attr.state_focused }, tap );
d.addState( new int[]{ android.R.attr.state_enabled }, normal );
d.addState( new int[]{ -android.R.attr.state_enabled }, tomei );

btn.setBackgroundDrawable( d );


面白いポイントは以下の通り。

  • orじゃなくて配列で指定するんだね。
  • xmlでいうfalseを指定するにはマイナス(minus)にするんだね!(1時間くらい探した・・・)



ところで、Drawable.setStateの使い方がよくわからん。
例えば、下記の設定を行なってみたが効かない。

// 効いていないようだ
d.setState( new int[]{ android.R.attr.constantSize } );

コメント

このブログの人気の投稿

nginxでlocalhostとしてアクセスをサーバーに転送する方法

Android・・・テキスト描画あれこれ, ascent(), descent()等