XMLうざいとか、XMLであれこれ指定するのはキライと、全てを、Javaのコードの側でウィジェットの配置からメニューから全部書いちゃう人もいるようですが、コードとビューを分離するのは、トレンドですので、逆らっても仕方ありません。
大体、便利なこともあるんですよ。例えば、例のマッシュルームは、イメージボタンを多用しているのですが、押したときには、ボタンの背景が一応白くなるようになっています。
全部のビットマップについて、周囲を白くしたパターンを用意するのはアホですので、一つだけ、豆腐の背景を用意しておいて、XMLで合成するように指定しているのです。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<layer-list>
<item>
<bitmap android:src="@drawable/bg" android:antialias="true" />
</item>
<item>
<bitmap android:src="@drawable/signaler" android:antialias="true" />
</item>
</layer-list>
</item>
<item>
<bitmap android:src="@drawable/signaler" android:antialias="true" />
</item>
</selector>
これがボタンの定義です。これを、イメージボタンの背景に指定してあります。背景はあるが、前景のビットマップは用意していません。まあ、前景に絵文字のビットマップ、背景に、押されたときだけ白い豆腐が表示されるようにしてもいいのかもですが、いずれにしても、XMLでの処理になります。
ポイントは、<item android:state_pressed="true">~</item>の中にある<layer-list>~</layer-list>です。この中に指定された drawableなアイテムは指定された順番にスタックされていきます。上の例なら bgというビットマップの上に、signalerというビットマップを重ねるということになります。いうまでもなくbgが豆腐です。これで、合成されたビットマップが押されたときの背景になるようになるわけです。
つかいようによっては、とても便利につかうことができることが分かります。なお、もっといえば、bgは、ビットマップとして用意しないでも、<shape>~</shape>というXMLで定義することもできます。単純な図形なら、XMLで事足りてしまうのがまたAndroidなんですねー。
コメント