Android輝度調整

6933 ワード

最近はAppの設定項目を作っていて、輝度調整をしています.実際にやってみると、Androidの明るさ調節は予想以上に複雑であることがわかりました.実は現在、ネット上にはこの方面の資料がたくさんありますが、一部の博文には一定の誤導性があります.ここでこの内容を自分の理解に沿って整理します.
全体的に、Androidの輝度調整は、Androidシステムの輝度調整、Android Appの輝度調整、Androidの現在の画面(Window)の輝度調整の3つの階層に分かれています.
1.Androidシステムの明るさ調節
Androidシステムの輝度調整はグローバル性が最も高く、システム設定の輝度設定項目によく見られる.Androidでは、システムの輝度値(「手動モードでの輝度値」)を取得して設定するインタフェースが用意されています.具体的には、以下のとおりです.
1 //       
2 Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
1 //       
2 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);

なお、輝度値は0〜255の整数値を返している.
Android 2.1以降のシステムでは、システムの明るさ調整に「自動明るさ」オプションが追加されました.「自動輝度」は外部の光源によって自動的にシステムの輝度を変えるもので、現在、ほとんどの携帯電話では「自動輝度」を小幅に調整することもできる.自動輝度に対応する「手動輝度」は、「手動輝度」でドラッグ輝度バーを設定するとAndroidシステムの輝度が大幅に変化します.「手動輝度」と「自動輝度」をそれぞれAndroidシステムの「輝度モード」と呼ぶ.
これに対応して、Androidシステムでは「輝度モード」を取得して設定するインタフェースも提供されています.
1 //         
2 Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
1 //         
2 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, systemMode);

しかし残念なことに、Androidでは「自動輝度」モードの輝度値インタフェースは提供されていません.上述した取得システム輝度値インタフェースは、実際には「手動輝度」モードの輝度値を指す.
一般に、手動輝度値およびシステム輝度モードインタフェースを設定することによって、システム輝度調整を完了するために、従来のAndroidシステム輝度設定の符号化要件の大部分を満たすことができる.
 
2.Android App輝度調整
システムの明るさとは異なり、AndroidではAppレベルの明るさ調整方式を直接提供していない.従って、Appを行う必要がある輝度調整は、システム輝度調整または現在の画面の輝度調整方式によって間接的に実現することができる.
 
3.Android現在の画面の明るさ調整
Androidは現在の画面(Window)に輝度を設定するインタフェースを提供しており、一般的な書き方は以下の通りです.
1 Window window = activity.getWindow(); 2 WindowManager.LayoutParams lp = window.getAttributes(); 3 lp.screenBrightness = brightness; 4 window.setAttributes(lp);

ここで、brightnessは、0.0〜1.0のfloatタイプの数値であることに注意してください.
デフォルトでは、システムの輝度値を直接変更すると、現在のWindowでは輝度効果が即座に反応します.これは、デフォルトではWindowManagement.LayoutParamsのscreenBrightnessのデフォルト値はWindowManagerです.LayoutParams.BRIGHTNESS_OVERRIDE_NONE.
すなわち,Windowには独自の輝度パラメータがなく,システムの輝度効果の変化に応じて変化することを示す.これは、システムの輝度を調整すると、すべてのWindowがシステムの輝度設定効果に即座に反応します.
当時、実際のプロジェクトでは、システム自体の輝度設定に影響を与えることなく、現在のWindowまたはApp内でのみ輝度を設定する必要がありました.
現在のWindow内にSeekBarがあると仮定すると、UIはシステム輝度調整UIと基本的に類似しており、ユーザはこのSeekBarをスライドさせて、現在のWindow輝度が即座に変化し、システム輝度効果に影響を及ぼさないようにすることができる.どのように実現しますか?
WindowManagerを有効にする必要がありますLayoutParamsのscreenBrightnessパラメータは、自動的に特定の輝度値を持つようにします.この値を設定すると、現在のWindow範囲内でシステムの輝度設定が上書きされます.
従って、ユーザが選択した輝度値を対応するWindow輝度値に変換する必要がある(SeekBarの最大値が255であると仮定するシステム輝度値と一致する).
 1 //          window  
 2 public void changeAppBrightness(Context context, int brightness) {  3     Window window = ((Activity) context).getWindow();  4     WindowManager.LayoutParams lp = window.getAttributes();  5     if (brightness == -1) {  6         lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;  7     } else {  8         lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;  9  } 10  window.setAttributes(lp); 11 }

ここで、brightnessパラメータは、ユーザが選択した輝度値である.
では、上記のコードにはなぜ「brightness=-1」の判断があるのでしょうか.これは主に、App設定項目に表示される「システム輝度に従う」または「システムデフォルト輝度を復元する」という設定を考慮し、ユーザーがこのような操作を行う場合、screenBrightnessパラメータを直接デフォルトパラメータに復元すればよい.前述した「自動輝度」モードではシステム輝度値は直接得られないため、システムが「自動輝度」モードにある場合、brightnessパラメータ値は正確に決定できないため、screenBrightnessパラメータをデフォルトパラメータ値に復元することは有効な方法となる.
 
4.Android App輝度調節可行方案分析
現在、ネット上では多くの博文でApp輝度調整に言及しているが、提案されている案はApp設定項目の中で、まず設定前のシステム輝度値と輝度モードを記録し、ユーザーはApp設定項目が輝度調整を行う際に、直接システム輝度値を修正し、ユーザーがこのAppを脱退したり、Appがバックグラウンド(ホームボタンを押すなど)に至ったりしてから、システム輝度を復元することである.最初は実行可能な案のように見えた.しかし、主に次のような問題があります.
1.設定前のシステム輝度値と輝度モードをどのように取得しますか(このAppの外部でシステム輝度値をこの初期値に戻すためです).ユーザーが設定ページに入るたびに取得しますか?厳密な意味では、正確に記録することはできません.Androidのユーザー操作が予知できないため、例えば設定ページに入り、SeekBarをドラッグして輝度値を設定した場合、システムの輝度値を直接修正し、この場合、ユーザーはアプリケーションをバックグラウンドにしたり、アプリケーションを終了したりしない場合、Appの外部でシステムの輝度設定を直接修正し、例えば小米でタイトルバーをドロップダウンすることができます.システムの明るさを直接設定できます.従って、App輝度設定前のシステム輝度初期値の取得は困難である.
2.ユーザーがApp外部に来たとどのように判断しますか?この場合、システム輝度を初期システム輝度に設定する必要があるためです.ユーザーがホームボタンを押すことができ、ホームボタンを長く押すことで直接Appを切り替えることができ、直接Backボタンなどが一歩一歩このAppを脱退し、ドロップダウンタイトルバーが他のApp通知情報を直接クリックして他のAppに入ることができ、携帯電話が自動的に画面をロックした後にロックを解除する時にユーザーが直接他のアプリケーションに入るなど、このような操作シーンも予知できないため、ユーザがApp外部に来てシステム輝度を初期値に復元するタイミングを判断することも困難である.
これにより、App輝度調整方式は、現在の画面を設定することにより行うことが推奨される.
ユーザが設定項目で明るさ調整を行う場合、changeAppBrightness()メソッドを呼び出し、現在の画面(Window)の明るさを変更します.この場合、システムの明るさには何の影響もありません.次に存在する問題は、ユーザが本Appの他のActivityに来たときに、設定した明るさを即時に反応させる価値がある場合に集中します.
ユーザが輝度調整を行った後、SharedPreferencesに保存するなどの現在の輝度設定値を保存し、ベースクラスActivityのonResumeメソッドでは、SharedPreferencesのユーザが設定したApp輝度値を取り出し、現在の各画面の輝度調整を行うためにchangeAppBrightness()メソッドを使用します.
全体的に、現在の画面(Window)を設定することで、App輝度を設定することがより簡単で効率的です.