プログラミングに関する覚書のようなものを書いてみたいと思います(最近忘れっぽくなってきた自分のためにもw)。
今回のテーマは「画面の明るさ調節機能を実装する」です。
新作アプリ
『Battery Support(バッテリーサポート)』のなかでもこの機能を実装しています(メインではありませんがw)。
実装したのはこんな感じ↓
① SeekBarでお好みの明るさを設定する
(もちろんSeekBarを動かした時点ですぐにその明るさが画面に反映されるようにする)
② SeekBarで選択した値を「端末画面の明るさ」の値(screen_brightness)として保存する
(アプリ内画面の明るさの値ではないので注意!)
③ アプリを終了して他の画面になっても、設定した明るさが反映されている
まずやってみたのがSeekBarで選択した値を直接端末画面の明るさの値として保存しようと試みた。
一応これで上手くはいく。が重大な問題が発生。。。
それは、SeekBarを動かしてもすぐにその明るさが画面に反映されないということです。
これではユーザーにとってちょっと使い勝手が悪い。というか、悪すぎるw
そこで次に試したのが、SeekBarでは「アプリ内画面の明るさ」の値を変更するようにして、その値を上手く「端末画面の明るさの値」として設定・変更したことでした。
これはバッチリ上手くいきました。ですがちょっと面倒な問題があります。
それは「アプリ内画面の明るさの値」(WindowManager.LayoutParamsのscreenBrightness)の範囲と「端末画面の明るさの値」(Settings.System.getString(getContentResolvor(),"screen_brightness")で取得できる値)の範囲が異なるということです。
もう一つ言うと、画面の明るさをユーザーに対して数値で表示したい場合(『Battery Support』のなかでは表示していませんが)、普通は1%~100%で表示したいと思います。
つまり解決すべき問題は・・・・
「アプリ内画面の明るさの値」の範囲 → 0.0 ~ 1.0
「端末画面の明るさの値」の範囲 → 0 ~ 255
「ユーザーに表示したい明るさの値」の範囲 0 ~ 100
という3つの異なる範囲の値をうまく調節/変換してあげなければいけないということです。
このプログラミングのアプローチはこうです。
① SeekBarで「アプリ内画面の明るさの値」を取得する
② ユーザーに表示するために、取得した値を1~100までの値に変換する
③ さらにその値を「端末画面の明るさの値」の範囲である1~255までの値に変換してあげる
(これは①で取得した「アプリ内画面の明るさの値」を変換してもOK)
④ 最後に③の値を"Settings.System.putInt(getContentResolver(),Settings.System.SCREEN_BRIGHTNESS, "③の値");"で保存して変更してあげればOK
余談ですが、「アプリ内画面の明るさの値」にしても「端末画面の明るさの値」にしても、最小値を0もしくは0.0にしてはダメです! 真っ暗になって何も見えなくなってしまい操作できず。。。なんていう面倒なことになってしまうのでw まぁ、当然と言えば当然のことなのですがw
なので、SeekBarでの最小値設定は0ではなく1に設定してあげるようにしましょう。
(ただし、SeekBarに最小値を設定するメソッドが残念ながら無いんですよねw setMax()はあるのにw)
『Android SDK 逆引きハンドブック』の「SELECTION-241 端末画面の明るさを調べる」と「SELECTION-242 アプリケーションの画面の明るさを変更する」が情報として参考になります。チェックしてみてください。
↓ よければフォローお願いします
Twitterブログパーツ