画面(バックライト)の明るさを変える


今回は端末の画面(バックライト)の明るさを変える方法について紹介します。

端末の画面の明るさを変えるにはWindowクラスsetAttributesメソッドを使います。
setAttributesに与えるパラメータにはWindowManager.LayoutParamsクラスに定義されている
screenBrightness定数を指定します。
screenBrightnessに設定できる値は0未満がデフォルト(システム設定)、
0.0(暗)~1.0(明)となっています。

(2010/11/09:LayoutParamsはたくさんあるよ、と教えてもらいました。WindowManager.LayoutParamsに修正しました。@yanzmさん、ご指摘ありがとうございました!)

ただし、この方法で変更できるのは現在表示されているウィンドウの輝度のみで、
システム全体の輝度は変更できませんので注意が必要です。

続きからサンプルコードです。

静的に輝度を設定するのであれば以下のような実装になります。

1
2
3
4
5
Window myWin = getWindow(); //現在の表示されているウィンドウを取得
LayoutParams lp = new LayoutParams(); //LayoutParams作成
 
lp.screenBrightness = 1.0f; //輝度最大
myWin.setAttributes(lp); //ウィンドウにLayoutParamsを設定

getWindow()メソッドで現在表示されているウィンドウを取得します。
更に、新規作成したLayoutParamsオブジェクトのscreenBrightnessに輝度を代入します。
このLayoutParamsオブジェクトをsetAttributesメソッドでウィンドウに設定することで輝度が変更されます。

これを応用して、シークバーを使って輝度調整を行うようにすると以下のようなコードになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
seekBar.setOnSeekBarChangeListener(
        new OnSeekBarChangeListener() {
            public void onProgressChanged(SeekBar seekBar,
                    int progress, boolean fromUser) {
                float value = progress/100f; //プログレスバーの値を輝度設定値に変換
 
                    lp.screenBrightness = value; //プログレスバーの値を設定
                    myWin.setAttributes(lp);
 
            tv1.setText("Brightness:"+value+"%"); //設定輝度を表示
            }
        }
);

輝度を低くし過ぎるとフォーカスを失う問題

上記の実装で輝度を調節できるのですが、輝度を低くし過ぎるとWindowがフォーカスを失ってしまい、
タッチパネルやHomeボタンを押しても操作できなくなってしまいます。
Xperiaでは輝度を0にするとフォーカスを失ってしまったのですが、他の端末では閾値が異なるようです。
このような問題点があるので、フォーカスを失ってしまう閾値を超えないように実装を工夫する必要があります。

2 Comments