読者です 読者をやめる 読者になる 読者になる

kojiko-android’s blog

開発中にハマった時の解決策や、忘れがちなことを残しておきます。

ボタンをタップした時に動的に色を変える方法

Android Studio 開発

たとえばカラーのカスタマイズが出来るアプリのように、
アプリ内から動的にボタンの色を変更した後、その色に基づいて
タップした時に色を変える方法です。

ボタンを”押した感”を演出します。

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値に戻し、ビューの背景色に再び設定します。

タップを離したときに、変数に入れておいたデフォルトの値をセットし、
押す前の状態に戻します。