2012年11月13日火曜日

selectorを用いた表現

androidに標準に入っているButton
押したら青く?反応するこの反応の色なんかを自分で設定できるらしいのでやってみた.


selectorの利用


例えばこんなボタン
いつものボタンを用いず, 背景色で色付けしたものだが, 当然このままでは押しても視覚的に変化は無し.
希望としては, ボタンをタップしたら,

例えばこんな風
に色が変わって反応して欲しいもの. だからといって押されるたびに

setBackgroundColor(int Color)

とかいってセットしては指が離れたらまたセットしなおすとかとてもじゃないけどめんどくさい('A`)

そこで登場 selector 

1. selector.xmlの用意

前回のグラデーションのお話でも用いた, res/drawableディレクトリを使用.やっぱり色は先に作っておくのが吉. またボタンに表示するテキストは drawableではいじれないので, res/colorディレクトリへ内容がほぼ同じものを, テキスト用 selector.xmlとして作って使いましょう.

わかりやすい名前で.xmlを作成.この時, ボタンを押されたとき, 押されていないとき両方の色の指定をこの.xmlでやるので, わざわざそれぞれ.xmlを作ったりしないように.

xmlを作成する際, selector を先に Root Element: から選んでおくと楽…かな(・ω・`)
どうせ中で宣言できるけど.


<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_pressed="true"  android:drawable="@color/押されたときの色"/>
    <item android:state_pressed="false"  android:drawable="@color/普段の色"/>
</selector>

よくある話で <selector> がデフォルトの <animation-list> になっているまま作成→動かねえぞこれ
(゜д゜;三;゜д゜)
なんてこともあるので注意. …ないか('A`)
<selector>の中に2つの<item>を入れ子にして宣言. <item>にはそれぞれ"状態"がtrueのとき, falseのとき, それぞれ使う色を指定できる.
また"状態"にあたるのが

android:state_pressed


これが"ボタンが押されている状態"を表す. なのでこの場合はボタンが押されていれば上, 指が離れたら下の<item>を参照するぞ, というselectorになる.

ちなみにこの"状態", ラジオボタンに用いたいときは,

android:state_checked

を用いる必要がある. でないと押した瞬間だけ色が変わるラジオボタンの出来上がりである.orz
なおテキスト用は

android:drawable

のところを

android:color

に書き換えてやるだけ. ってゆーかdrawableが無い.

2. 実装

用意ができたらいざ実装. selectorを使いたいボタンに対して,

 android:background="@drawable/背景用selector"
 android:textColor="@color/テキスト用セレクター"

と指定してやるだけ. これで後は何もせずとも勝手に色を変えてくれます.

またしてもちなみにラジオボタンで使う場合.

android:button="@null"

してやらないと, ラジオボタンの
こいつ('A`)
が居座り続けるという大惨事に.


画像が使いにくい…(・ω・`)

0 件のコメント:

コメントを投稿

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...