Android亮度調(diào)節(jié)的幾種實現(xiàn)方法
最近在做一個App的設(shè)置項,亮度調(diào)節(jié)。真正做時,發(fā)現(xiàn)Android亮度調(diào)節(jié)比預(yù)想要復(fù)雜一些。其實目前網(wǎng)上已有不少這方面的資料,但有些博文具有一定誤導(dǎo)性。在此將這塊內(nèi)容按照自己理解整理一下。
整體上看,Android亮度調(diào)節(jié)分為三個層次,分別是:Android系統(tǒng)亮度調(diào)節(jié)、Android App亮度調(diào)節(jié)和Android當(dāng)前屏幕(Window)亮度調(diào)節(jié)。
1.Android系統(tǒng)亮度調(diào)節(jié)
Android系統(tǒng)亮度調(diào)節(jié)全局性最高,常見于系統(tǒng)設(shè)置中的亮度設(shè)置項。Android中提供了獲取和設(shè)置系統(tǒng)亮度值(“手動模式下的亮度值”)的接口,具體如下:
// 獲取系統(tǒng)亮度 Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); // 設(shè)置系統(tǒng)亮度 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS,systemBrightness);
其中,需要注意的是,返回的亮度值是處于0-255之間的整型數(shù)值。
Android 2.1以后的系統(tǒng)中,系統(tǒng)亮度調(diào)節(jié)中新增了“自動亮度”選項?!白詣恿炼取笔且罁?jù)外界光源來自動的改變系統(tǒng)亮度,目前大部分手機中對“自動亮度”還可以進行小幅度的調(diào)節(jié)其值。與自動亮度相對應(yīng)的是“手動亮度”,當(dāng)處于“手動亮度”下,設(shè)置拖動亮度進度條會大幅度的改變Android系統(tǒng)亮度。“手動亮度”和“自動亮度”分別稱之為Android系統(tǒng)的“亮度模式”。
與之相對應(yīng)的,Android系統(tǒng)中也提供了獲取和設(shè)置“亮度模式”的接口。
// 獲取系統(tǒng)亮度模式 Settings.System.getInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE);
// 設(shè)置系統(tǒng)亮度模式 Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, systemMode);
可是遺憾的是,Android中并未提供處于“自動亮度”模式下的亮度值接口。上面所說的獲取系統(tǒng)亮度值接口實際上都是指“手動亮度”模式下的亮度值。
一般而言,通過手動亮度值以及設(shè)置系統(tǒng)亮度模式接口,可以滿足常規(guī)的大部分針對Android系統(tǒng)亮度設(shè)置編碼需求,以完成系統(tǒng)亮度調(diào)節(jié)。
2.Android App亮度調(diào)節(jié)
與系統(tǒng)亮度不同的是,Android中并未直接提供針對于App層面的亮度調(diào)節(jié)方式。因此,對于需要進行App的亮度調(diào)節(jié),可以通過系統(tǒng)亮度調(diào)節(jié)或當(dāng)前屏幕的亮度調(diào)節(jié)方式間接來實現(xiàn)。
3.Android當(dāng)前屏幕(Window)亮度調(diào)節(jié)
Android針對當(dāng)前屏幕(Window)提供了設(shè)置亮度的接口,常見寫法如下:
Window window = activity.getWindow(); WindowManager.LayoutParams lp = window.getAttributes(); lp.screenBrightness = brightness; window.setAttributes(lp);
其中,需要注意的是此處的brightness是一個0.0-1.0之間的一個float類型數(shù)值。
默認(rèn)情況下,當(dāng)我們直接修改了系統(tǒng)亮度值后,當(dāng)前Window中是可以即時反應(yīng)出來亮度效果的,這是因為默認(rèn)情況下,WindowManager.LayoutParams的screenBrightness的默認(rèn)值為WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE。
即表示W(wǎng)indow沒有自己的亮度參數(shù),將依隨系統(tǒng)亮度效果的變化而變化。這也就是我們最常見的:當(dāng)調(diào)整系統(tǒng)亮度后,所有Window都即時反應(yīng)出系統(tǒng)亮度設(shè)置效果。
當(dāng)時,實際項目中我們還會遇到此類需求:系統(tǒng)設(shè)置亮度時只針對當(dāng)前Window或App內(nèi)生效,而不影響到系統(tǒng)本身的亮度設(shè)置。
假設(shè)當(dāng)前Window內(nèi)有一個SeekBar,UI與系統(tǒng)亮度調(diào)節(jié)UI基本類似,用戶可以滑動此SeekBar,使得當(dāng)前Window亮度即時發(fā)生變化,且不影響到系統(tǒng)亮度效果。如何實現(xiàn)呢?
此時我們需要啟用WindowManager.LayoutParams的screenBrightness參數(shù),使之具有自動的特定亮度值,設(shè)置此值后在當(dāng)前Window范圍內(nèi),其將覆蓋掉系統(tǒng)亮度設(shè)置。
因此,有必要將用戶選擇的亮度值轉(zhuǎn)換為相應(yīng)的Window亮度值(為與系統(tǒng)亮度值相一致,假設(shè)SeekBar的最大值為255)。
// 根據(jù)亮度值修改當(dāng)前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設(shè)置項中可能出現(xiàn)的“跟隨系統(tǒng)亮度”或“恢復(fù)系統(tǒng)默認(rèn)亮度”此類設(shè)置,當(dāng)用戶進行此類操作時,直接將screenBrightness參數(shù)還原成默認(rèn)參數(shù)值即可。因為由前文描述“自動亮度”模式下系統(tǒng)亮度值是不能直接得到的,那么當(dāng)系統(tǒng)處于“自動亮度”模式下,此時brightness參數(shù)值將無法準(zhǔn)確確定,因此,將screenBrightness參數(shù)還原成默認(rèn)參數(shù)值成為一個行之有效的方法。
4.Android App亮度調(diào)節(jié)可行方案分析
目前網(wǎng)上有不少博文中提到App亮度調(diào)節(jié)時,提出的方案是在App設(shè)置項中,首先記錄下設(shè)置之前的系統(tǒng)亮度值和亮度模式,用戶在App設(shè)置項進行亮度調(diào)節(jié)時,直接修改系統(tǒng)亮度值,當(dāng)用戶退出此App,或App至于后臺(如按下Home按鍵等),再將系統(tǒng)亮度還原。初看起來貌似一個可行的方案。但是主要存在如下幾個問題:
1.如何獲取到設(shè)置之前的系統(tǒng)亮度值和亮度模式(因為之后在此App外部要恢復(fù)系統(tǒng)亮度值到此初始值)?當(dāng)用戶每次進入到設(shè)置頁時獲???嚴(yán)格意義上來說,是沒法準(zhǔn)確記錄的。因為Android的用戶操作不可預(yù)知性,如進入到設(shè)置頁,拖動SeekBar設(shè)置了一個亮度值,此時直接修改了系統(tǒng)的亮度值,如果此時用戶在未將應(yīng)用至于后臺或未將應(yīng)用退出的情況下直接在App外部修改了系統(tǒng)亮度設(shè)置,如小米中可以通過下拉標(biāo)題欄,直接就可以設(shè)置系統(tǒng)亮度。因此,App亮度設(shè)置之前的系統(tǒng)亮度初始值獲取存在困難。
2.如何判斷用戶來到了App外部?因為此時需要恢復(fù)系統(tǒng)亮度設(shè)置到初始系統(tǒng)亮度。如用戶可以按下Home按鍵,長按Home按鍵直接切換App,直接Back按鍵等一步步退出此App,下拉標(biāo)題欄直接點擊其他App通知信息進入到其他App,手機自動鎖屏后解鎖時用戶直接進入其他應(yīng)用等等,此類操作場景也具有不可預(yù)知性,因此,判斷用戶來到了App外部以恢復(fù)系統(tǒng)亮度到初始值的時機上也存在一定困難。
由此,App亮度調(diào)節(jié)方案推薦通過設(shè)置當(dāng)前屏幕(Window)方式進行。
大致思路如下:用戶在設(shè)置項中進行亮度調(diào)節(jié)時,調(diào)用changeAppBrightness()方法,將改變當(dāng)前屏幕(Window)的亮度,此時對系統(tǒng)亮度無任何影響,接下來存在的問題終于要就集中于當(dāng)用戶來到本App其他Activity中,如果使得剛剛設(shè)置的亮度值得以即時反應(yīng)出來。
當(dāng)用戶進行亮度調(diào)節(jié)后,將當(dāng)前亮度設(shè)置值保存起來(如保存到SharedPreferences中),在基類Activity中的onResume方法中,可以取出SharedPreferences中的用戶所設(shè)置的App亮度值,然后changeAppBrightness()方法以實現(xiàn)每個當(dāng)前屏幕的亮度調(diào)節(jié)。
總體說來,通過設(shè)置當(dāng)前屏幕(Window)的方式來設(shè)置App亮度更加簡單有效。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android開發(fā)實現(xiàn)調(diào)節(jié)屏幕亮度功能
- Android視頻播放器屏幕左側(cè)邊隨手指上下滑動亮度調(diào)節(jié)功能的原理實現(xiàn)
- Android編程調(diào)節(jié)屏幕亮度(背景燈)及保持背景燈常亮的方法
- Android調(diào)節(jié)屏幕亮度實現(xiàn)代碼
- android 如何設(shè)置開機后屏幕亮度默認(rèn)值為自動調(diào)節(jié)
- 使用android隱藏api實現(xiàn)亮度調(diào)節(jié)的方法
- android 屏幕亮度調(diào)節(jié)方法詳解
- Android 如何實現(xiàn)亮度自動調(diào)節(jié)
相關(guān)文章
Android仿美團網(wǎng)、大眾點評購買框懸浮效果修改版
這篇文章主要為大家詳細介紹了Android仿美團網(wǎng)、大眾點評購買框懸浮效果的修改版,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02Android SlidingDrawer 抽屜效果的實現(xiàn)
本篇文章小編為大家介紹,Android SlidingDrawer 抽屜效果的實現(xiàn)。需要的朋友參考下2013-04-04Android studio導(dǎo)出APP測試包和構(gòu)建正式簽名包
大家好,本篇文章主要講的是Android studio導(dǎo)出APP測試包和構(gòu)建正式簽名包,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下2021-12-12