ボタンをタップした時に動的に色を変える方法
たとえばカラーのカスタマイズが出来るアプリのように、
アプリ内から動的にボタンの色を変更した後、その色に基づいて
タップした時に色を変える方法です。
ボタンを”押した感”を演出します。
ColorTintListや、セレクター等を使わずに、
ビューの色を取得 → 明度に変更を加える
という処理を行っています。
private int temporaryColorInt; private Button BUTTON_SAMPLE; BUTTON_SAMPLE.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: ColorDrawable colorDrawable = (ColorDrawable) v.getBackground(); temporaryColorInt = colorDrawable.getColor(); float[] hsv = new float[3]; Color.colorToHSV(colorDrawable.getColor(), hsv); hsv[2] -= 0.2f; v.setBackgroundColor(Color.HSVToColor(hsv)); break; case MotionEvent.ACTION_UP: v.setBackgroundColor(temporaryColorInt); break; } return true; } });
temporaryColorIntは、カラーを一時的に格納するために定義した変数で、
ボタンを押す前のデフォルトの色を入れています。
バックグラウンドカラーを整数で取得
ColorDrawable colorDrawable = (ColorDrawable) v.getBackground();
int color = colorDrawable.getColor();
ボタンのBackgroundColorを取得します。
まわりくどいですが、このようにするしかなさそうです。
色相、彩度、明度、に分解後、変更を加え、適用する
float[] hsv = new float[3];
Color.colorToHSV(colorDrawable.getColor(), hsv);
hsv[2] -= 0.2f;
v.setBackgroundColor(Color.HSVToColor(hsv));
明るさだけを変更したいので、色の値をHSV表現に変換しています。
hsv[2] -= 0.2f;
明度を少しだけ暗くします。これはお好みです。
変更を加えたHSVをint値に戻し、ビューの背景色に再び設定します。
タップを離したときに、変数に入れておいたデフォルトの値をセットし、
押す前の状態に戻します。