国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android亮度調節的幾種實現方法

2019-12-12 04:49:08
字體:
來源:轉載
供稿:網友

最近在做一個App的設置項,亮度調節。真正做時,發現Android亮度調節比預想要復雜一些。其實目前網上已有不少這方面的資料,但有些博文具有一定誤導性。在此將這塊內容按照自己理解整理一下。

整體上看,Android亮度調節分為三個層次,分別是:Android系統亮度調節、Android App亮度調節和Android當前屏幕(Window)亮度調節。

1.Android系統亮度調節

Android系統亮度調節全局性最高,常見于系統設置中的亮度設置項。Android中提供了獲取和設置系統亮度值(“手動模式下的亮度值”)的接口,具體如下:

// 獲取系統亮度Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);// 設置系統亮度Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);

其中,需要注意的是,返回的亮度值是處于0-255之間的整型數值。

Android 2.1以后的系統中,系統亮度調節中新增了“自動亮度”選項?!白詣恿炼取笔且罁饨绻庠磥碜詣拥母淖兿到y亮度,目前大部分手機中對“自動亮度”還可以進行小幅度的調節其值。與自動亮度相對應的是“手動亮度”,當處于“手動亮度”下,設置拖動亮度進度條會大幅度的改變Android系統亮度?!笆謩恿炼取焙汀白詣恿炼取狈謩e稱之為Android系統的“亮度模式”。

與之相對應的,Android系統中也提供了獲取和設置“亮度模式”的接口。

// 獲取系統亮度模式Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);

// 設置系統亮度模式Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, systemMode);

可是遺憾的是,Android中并未提供處于“自動亮度”模式下的亮度值接口。上面所說的獲取系統亮度值接口實際上都是指“手動亮度”模式下的亮度值。

一般而言,通過手動亮度值以及設置系統亮度模式接口,可以滿足常規的大部分針對Android系統亮度設置編碼需求,以完成系統亮度調節。

 2.Android App亮度調節

與系統亮度不同的是,Android中并未直接提供針對于App層面的亮度調節方式。因此,對于需要進行App的亮度調節,可以通過系統亮度調節或當前屏幕的亮度調節方式間接來實現。

3.Android當前屏幕(Window)亮度調節

Android針對當前屏幕(Window)提供了設置亮度的接口,常見寫法如下:

Window window = activity.getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.screenBrightness = brightness;window.setAttributes(lp);

其中,需要注意的是此處的brightness是一個0.0-1.0之間的一個float類型數值。

默認情況下,當我們直接修改了系統亮度值后,當前Window中是可以即時反應出來亮度效果的,這是因為默認情況下,WindowManager.LayoutParams的screenBrightness的默認值為WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE。

即表示Window沒有自己的亮度參數,將依隨系統亮度效果的變化而變化。這也就是我們最常見的:當調整系統亮度后,所有Window都即時反應出系統亮度設置效果。

當時,實際項目中我們還會遇到此類需求:系統設置亮度時只針對當前Window或App內生效,而不影響到系統本身的亮度設置。

假設當前Window內有一個SeekBar,UI與系統亮度調節UI基本類似,用戶可以滑動此SeekBar,使得當前Window亮度即時發生變化,且不影響到系統亮度效果。如何實現呢?

此時我們需要啟用WindowManager.LayoutParams的screenBrightness參數,使之具有自動的特定亮度值,設置此值后在當前Window范圍內,其將覆蓋掉系統亮度設置。

因此,有必要將用戶選擇的亮度值轉換為相應的Window亮度值(為與系統亮度值相一致,假設SeekBar的最大值為255)。

// 根據亮度值修改當前window亮度public void changeAppBrightness(Context context, int brightness) {  Window window = ((Activity) context).getWindow();  WindowManager.LayoutParams lp = window.getAttributes();  if (brightness == -1) {    lp.screenBrightness = WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE;  } else {    lp.screenBrightness = (brightness <= 0 ? 1 : brightness) / 255f;  }  window.setAttributes(lp);}

其中,brightness形參為用戶選擇的亮度值。

那么,上述代碼中為什么有一個"brightness == -1"的判斷呢?在此主要是考慮到App設置項中可能出現的“跟隨系統亮度”或“恢復系統默認亮度”此類設置,當用戶進行此類操作時,直接將screenBrightness參數還原成默認參數值即可。因為由前文描述“自動亮度”模式下系統亮度值是不能直接得到的,那么當系統處于“自動亮度”模式下,此時brightness參數值將無法準確確定,因此,將screenBrightness參數還原成默認參數值成為一個行之有效的方法。

 4.Android App亮度調節可行方案分析

目前網上有不少博文中提到App亮度調節時,提出的方案是在App設置項中,首先記錄下設置之前的系統亮度值和亮度模式,用戶在App設置項進行亮度調節時,直接修改系統亮度值,當用戶退出此App,或App至于后臺(如按下Home按鍵等),再將系統亮度還原。初看起來貌似一個可行的方案。但是主要存在如下幾個問題:

1.如何獲取到設置之前的系統亮度值和亮度模式(因為之后在此App外部要恢復系統亮度值到此初始值)?當用戶每次進入到設置頁時獲???嚴格意義上來說,是沒法準確記錄的。因為Android的用戶操作不可預知性,如進入到設置頁,拖動SeekBar設置了一個亮度值,此時直接修改了系統的亮度值,如果此時用戶在未將應用至于后臺或未將應用退出的情況下直接在App外部修改了系統亮度設置,如小米中可以通過下拉標題欄,直接就可以設置系統亮度。因此,App亮度設置之前的系統亮度初始值獲取存在困難。

2.如何判斷用戶來到了App外部?因為此時需要恢復系統亮度設置到初始系統亮度。如用戶可以按下Home按鍵,長按Home按鍵直接切換App,直接Back按鍵等一步步退出此App,下拉標題欄直接點擊其他App通知信息進入到其他App,手機自動鎖屏后解鎖時用戶直接進入其他應用等等,此類操作場景也具有不可預知性,因此,判斷用戶來到了App外部以恢復系統亮度到初始值的時機上也存在一定困難。

由此,App亮度調節方案推薦通過設置當前屏幕(Window)方式進行。

大致思路如下:用戶在設置項中進行亮度調節時,調用changeAppBrightness()方法,將改變當前屏幕(Window)的亮度,此時對系統亮度無任何影響,接下來存在的問題終于要就集中于當用戶來到本App其他Activity中,如果使得剛剛設置的亮度值得以即時反應出來。

 當用戶進行亮度調節后,將當前亮度設置值保存起來(如保存到SharedPreferences中),在基類Activity中的onResume方法中,可以取出SharedPreferences中的用戶所設置的App亮度值,然后changeAppBrightness()方法以實現每個當前屏幕的亮度調節。

 總體說來,通過設置當前屏幕(Window)的方式來設置App亮度更加簡單有效。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 烟台市| 中江县| 瓮安县| 饶阳县| 个旧市| 旬阳县| 温宿县| 阿巴嘎旗| 福建省| 安陆市| 襄城县| 长泰县| 三门峡市| 清丰县| 吴江市| 新闻| 武鸣县| 霞浦县| 马关县| 彩票| 泰州市| 普安县| 白山市| 铜梁县| 卢龙县| 白水县| 大冶市| 康马县| 邛崃市| 刚察县| 沂源县| 云林县| 芦溪县| 镇康县| 磴口县| 临桂县| 洛宁县| 南城县| 定远县| 民县| 萝北县|