久しぶりの更新です。 最近Androidのアプリ制作に打ち込んでいたため、ブログ更新に手が回りませんでした。
では、Androidアプリ制作で利用した小ネタを書き留めておきたいと思います。
ImageButtonパーツ
ImageButtonパーツは、Buttonの表示にイメージを利用できる便利なパーツです。 (Bitmapリソースの管理がよくないらしいですが、、、)
レイアウトXMLから利用するコード例はこんな感じになります。
|
|
android:background
がボタン部分、android:src
がボタンのシルク部分にあたる指定になります。
普通に使うとandroid:src
でイメージを指定する形になりますが、これだとAndroidのデフォルトのボタンスタイルの上に、指定イメージが乗るような見た目になるのでちょっと期待と異なってしまいます。
background="@null"
とすると、デフォルトのボタン部分が消えるので、イメージだけでボタンパーツを見せることができます。
しかし、こうすると、タッチ時のフィードバック(ボタンタッチ時のハイライト等)がなくなってしまいます。
ImageButtonのタッチフィードバック
ボタンを押したときは、UIの操作性を考慮して、即座のインタラクションが欲しいところです。
タッチのフィードバックの実装には、selector
を利用します。
selector
を使ったフィードバックの方法で、もっともよくあるのは色や大きさを少し変えたボタンイメージをもう一つ用意して、タッチ時にそのイメージと入れ替える方法です。(こちらの方法はStackOverflowなどによくあるのでそちらを参照ください)
しかし、この方法を使うとボタンがたくさんあるときは、ボタン画像のペア(シルク用とハイライト用)がボタン数分必要になり、リソースが大きくなってしまします。 また、ボタンのデザインがある程度統一されていると、ちょっと輝度を落としただけの画像をボタン数用意するのは、やや冗長な感じがします。
ハイライト用のペア画像を使わないでタッチフィードバックを実装する
そこで、ハイライト用の画像を利用しない方法として、shape
やcolor
を利用してハイライトを実装します。
まず、selector
のコードです。
|
|
ポイントは、android:state_pressed='true'
のついていない、シルク表示時のコードです。@color/transparent
とすることで利用イメージをそのまま表示しています。これで、android:state_pressed='true'
で指定した要素をタッチ時にオーバーレイするだけというselector
を作ることができます。
これをImageButtonのandroid:src
に指定します。
|
|
このとき、@drawable/image
と@drawable/selector
の指定はそれぞれ上記のようにします。android:background
にイメージ、android:src
にselector
を指定することで、イメージにselector
をオーバーレイすることができます。
オーバーレイするcolor
は、#80808080
のようにしておきます。これで、半透過のグレーでオーバーレイすることができます。
オーバーレイする効果を変更する
これまでのコードでは、ボタン指定領域いっぱいに#80808080
をオーバーレイするだけでした。
利用しているイメージが、領域いっぱいに四角形を描くようなイメージであればこれで問題ないと思いますが、少しマージンが埋め込まれたイメージや、サークルなどの形状のイメージだと、ハイライトとイメージの形状がずれておかしく見えてしまいます。
そこで、color
の代わりにshape
を利用してみます。
まず、shape
のコードです。
|
|
android:shape="oval"
を指定し、その中を#80808080
で塗りつぶします。
そしてこれを、先ほどのselector
に指定します。
|
|
すると、ボタン領域に接するように収まる円形のハイライトがかけられます。
まとめ
この方法を利用すると、ハイライト用の画像を用意せず、また複数のボタンでselector
を使いまわせるため、実装・デザイン両方で効率的にImageButtonを作成できます。
ただ、複雑な形状のボタンなどになるとshape
でも対応できなくなると思いますので、非常に凝ったボタンデザインのときには、ハイライト画像を利用するなど使い分けをすると良いかと思います。