1. 程式人生 > >Android中獲取並設定螢幕亮度

Android中獲取並設定螢幕亮度

最近在做一個Demo的時候用到了調節螢幕亮度的功能,於是上網搜尋了一下,並且寫了一個小Demo測試了一下,發現程式碼還是比較簡單的。Android中的亮度調節,主要有三個方向,一個是針對於系統的亮度調節,一個是針對於App的亮度調節,一個是針對當前螢幕的亮度調節。

  詳細的內容大家可以參考文章尾部博文,寫的特別詳細清楚,這裡我們只改變當前螢幕的亮度的實現:

下面是佈局檔案:

複製程式碼

1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="ggcomic.rabbit.lx.adjustlight.MainActivity">
11 
12 
13     <TextView
14         android:id="@+id/tv"
15         android:layout_below="@+id/seek"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:text="哈哈哈哈"/>
19     <SeekBar
20         android:id="@+id/seek"
21         android:layout_width="match_parent"
22         android:layout_height="wrap_content" />
23     <CheckBox
24         android:id="@+id/cb"
25         android:layout_below="@+id/tv"
26         android:layout_width="wrap_content"
27         android:layout_height="wrap_content"
28         android:text="跟隨系統亮度"/>
29 </RelativeLayout>

複製程式碼

佈局很簡單,這裡使用seekBar來充當進度條,與使用ProgressBar等是一樣的效果。

MainActivity中的程式碼:

複製程式碼

1 package ggcomic.rabbit.lx.adjustlight;
  2 
  3 import android.os.Bundle;
  4 import android.provider.Settings;
  5 import android.support.v7.app.AppCompatActivity;
  6 import android.view.Window;
  7 import android.view.WindowManager;
  8 import android.widget.CheckBox;
  9 import android.widget.CompoundButton;
 10 import android.widget.SeekBar;
 11 import android.widget.Toast;
 12 
 13 public class MainActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
 14 
 15 
 16     private SeekBar seekBar;
 17     private CheckBox cb;
 18 
 19     @Override
 20     protected void onCreate(Bundle savedInstanceState) {
 21         super.onCreate(savedInstanceState);
 22         setContentView(R.layout.activity_main);
 23         initView();
 24         initEvent();
 25     }
 26 
 27     /**
 28      * 初始化監聽
 29      */
 30     private void initEvent() {
 31         //設定seekBar進度被改變的時候的時間監聽
 32         seekBar.setOnSeekBarChangeListener(new MyOnSeekBarChangeListener());
 33         //設定CheckBox的點選監聽事件
 34         cb.setOnCheckedChangeListener(this);
 35     }
 36 
 37     /**
 38      * 初始化控制元件的一些操作
 39      */
 40     private void initView() {
 41         seekBar = (SeekBar) findViewById(R.id.seek);
 42         cb = (CheckBox) findViewById(R.id.cb);
 43         //設定最大刻度
 44         seekBar.setMax(255);
 45         //設定初始的Progress
 46         seekBar.setProgress(getSystemBrightness());
 47         //出世設定checkBox為選中狀態
 48         cb.setChecked(true);
 49         //設定初始的螢幕亮度與系統一致
 50         changeAppBrightness(getSystemBrightness());
 51     }
 52 
 53     /**
 54      * 獲得系統亮度
 55      *
 56      * @return
 57      */
 58     private int getSystemBrightness() {
 59         int systemBrightness = 0;
 60         try {
 61             systemBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
 62         } catch (Settings.SettingNotFoundException e) {
 63             e.printStackTrace();
 64         }
 65         return systemBrightness;
 66     }
 67 
 68     /**
 69      * 改變App當前Window亮度
 70      *
 71      * @param brightness
 72      */
 73     public void changeAppBrightness(int brightness) {
 74         Window window = this.getWindow();
 75         WindowManager.LayoutParams lp = window.getAttributes();
 76         if (brightness == -1) {
 77             lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
 78         } else {
 79             lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;
 80         }
 81         window.setAttributes(lp);
 82     }
 83 
 84     @Override
 85     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
 86         if (isChecked) {
 87             Toast.makeText(this, getSystemBrightness() + "", Toast.LENGTH_SHORT).show();
 88             changeAppBrightness(getSystemBrightness());
 89         } else {
 90             int seekBarProgress = seekBar.getProgress();
 91             changeAppBrightness(seekBarProgress);
 92         }
 93     }
 94 
 95     class MyOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
 96         @Override
 97         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
 98             //seekBar進度條被改變的時候取消checkBox的點選
 99             cb.setChecked(false);
100             //改變亮度
101             changeAppBrightness(progress);
102         }
103 
104         @Override
105         public void onStartTrackingTouch(SeekBar seekBar) {
106 
107         }
108 
109         @Override
110         public void onStopTrackingTouch(SeekBar seekBar) {
111 
112         }
113     }
114 
115 }

複製程式碼

程式碼看起來好像很多的樣子,不過關鍵程式碼只有不多,獲取系統亮度:

複製程式碼

1 private int getSystemBrightness() {
2         int systemBrightness = 0;
3         try {
4             systemBrightness = Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
5         } catch (Settings.SettingNotFoundException e) {
6             e.printStackTrace();
7         }
8         return systemBrightness;
9     }

複製程式碼

這個方法主要是用來獲取系統當前的螢幕的亮度,這句話是重點:

1 Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);

其中的Settings是provider包下的。

需要注意的是,返回的亮度是介於0~255之間的int型別值(也是為什麼我們將seekBar的MaxValue設定為255的原因)

然後是設定當前螢幕的亮度的程式碼:

複製程式碼

1 public void changeAppBrightness(int brightness) {
 2         Window window = this.getWindow();
 3         WindowManager.LayoutParams lp = window.getAttributes();
 4         if (brightness == -1) {
 5             lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;
 6         } else {
 7             lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;
 8         }
 9         window.setAttributes(lp);
10     }

複製程式碼

這裡我們先通過Window物件來獲取當前視窗,然後通過

1 WindowManager.LayoutParams lp = window.getAttributes();

老獲取當前視窗的屬性物件,screenBrightness為屬性物件中一個欄位,原始碼如下:

複製程式碼

1 /**
2          * This can be used to override the user's preferred brightness of
3          * the screen.  A value of less than 0, the default, means to use the
4          * preferred screen brightness.  0 to 1 adjusts the brightness from
5          * dark to full bright.
6          */
7         public float screenBrightness = BRIGHTNESS_OVERRIDE_NONE;

複製程式碼

可見,screenBrightness是一個0.0~1.0之間的float型別的引數,亮度由0.0~1.0遞增。如果該值小於0,則預設採取最優的螢幕亮度來適配(經過測試就是系統亮度),這裡我們使用了一個三目運算子,判斷如果亮度值小於0的話將其置為1.

程式碼中關於brightness==-1的判斷是將-1作為一個標誌位,標誌當app設定中包含"跟隨系統亮度"或者"恢復系統亮度"的時候,我們傳遞一個-1引數,這時將screenBrightness引數還原成預設數值(跟隨系統)即可。

 

思路

拖動seekBar的進度條來改變螢幕亮度的時候,主要的思路就是:

設定seekBar的OnSeekBarChangeListener監聽,當seekBar的進度改變的時候,我們得到當前的進度,然後將其轉換成0.0~1.0之間的值,為當前窗體的屬性screenBrightness屬性設定值,完成螢