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

首頁 > 系統 > Android > 正文

Android編程實現夜間模式的方法小結

2019-12-12 01:18:10
字體:
來源:轉載
供稿:網友

本文實例講述了Android編程實現夜間模式的方法。分享給大家供大家參考,具體如下:

隨著APP實現的功能越來越豐富, 看小說看視頻上網等等, 現在不少人花在手機平板等移動終端上的時間越來越長了. 但手機和平板的屏幕并不像Kindle那類電紙書的水墨屏那么耐看, 由于自發光的屏幕特性, 我們長期盯著屏幕看容易眼睛酸痛疲倦, 因此各種護目模式, 夜間模式在移動APP上得到廣泛應用, 這的確也是一個貼心的小功能. 所以這次我們探討下幾種實現方式, 一起學習總結下:

1. 利用屏幕亮度

當夜間使用手機等終端, 直接降低屏幕亮度, 能減少光線強度對眼鏡的刺激, 這也是最簡單, 也相對有效的方式.

請先添加相應權限:

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

通過設置屏幕亮度來實現的方法, 有兩種:

1) 只設置應用程序內的亮度

一般, Android里每個Activity對應一個可視的界面, 針對每個Activity去設置亮度, 方法如下:

public static void setBrightness(Activity activity , float brightnessValue){    WindowManager.LayoutParams lp = activity.getWindow().getAttributes();    if(brightnessValue > 1.0f)    {      lp.screenBrightness = 1.0f;    }    else if(brightnessValue <= 0.0f)    {      lp.screenBrightness = 0.0f;    }    else    {      lp.screenBrightness = brightnessValue;    }    activity.getWindow().setAttributes(lp);}

這樣, 一個程序包含的所有Activity, 我們都要單獨去設置它的亮度, 雖說可以封裝成工具類去使用, 但前提是有沒有更好的方法呢? 請看第二種:

2) 設置手機系統的亮度(全局亮度)

這里, 我們直接在程序的某個Activity, 比如入口Activity去設置整個手機的亮度. 由于已經設置手機全局的亮度, 那么后面無論跳轉到哪個界面, 甚至退出程序, 手機的亮度依然是所設置的亮度. 這種方法相對第一種而言算是"一勞永逸". 但這里我們先要理清思路, 考慮好幾個點:

打開應用后, 獲取手機原來的亮度值并保存它(可用于退出應用后恢復正常亮度) --->  如果手機打開自動亮度調節則關閉自動調節, 然后設置合適的較低亮度 --->  將設置的亮度值應用到手機中  --->  最后,退出應用時利用保存的原亮度值恢復原來亮度, 并重新打開手機的自動亮度調節.

接下來, 貼上關鍵代碼:

首先是獲取手機屏幕亮度值:

/*** 獲取當前系統亮度* <br>獲取失敗返回-1,獲取成功返回正常非負數<br>* @param context* @return*/public static int getSystemBrightness(Context context){    int brightnessValue = -1;    try    {      brightnessValue = Settings.System.          getInt(context.getContentResolver(),Settings.System.SCREEN_BRIGHTNESS);    }    catch (Exception e)    {      e.printStackTrace();    }    return brightnessValue;}

保存, 直接放在SharePreference里面就好了, 相關代碼就不寫了.
然后檢測手機是否打開亮度自動調節的開關:

/*** 是否打開自動調節亮度* @param contentResolver* @return*/public static boolean isAutoBrightness(ContentResolver contentResolver){    boolean autoBrightness = false;    try    {      autoBrightness          = Settings.System.getInt(contentResolver ,              Settings.System.SCREEN_BRIGHTNESS_MODE)          == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;    }    catch (Exception e)    {      e.printStackTrace();    }    return autoBrightness;}

如果打開, 就關閉:

/*** 停止自動調節亮度* @param activity*/public static void closeAutoBrightness(Activity activity){  Settings.System.putInt(activity.getContentResolver(),    Settings.System.SCREEN_BRIGHTNESS_MODE,    Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);}

最后還會用到打開亮度調節:

public static void openAutoBrightness(Activity activity){  Settings.System.putInt(activity.getContentResolver(),    Settings.System.SCREEN_BRIGHTNESS_MODE,    Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);}

關閉亮度調節后, 就設置亮度, 直接使用第一種方法中的相關代碼即可. 但因為要將該亮度的設置應用到全局, 所以需要將該亮度值保存到手機中:

/*** 保存全局的亮度值設置* @param contentResolver* @param brightnessValue 亮度值*/public static void saveBrightness(ContentResolver contentResolver , int brightnessValue){    Uri uri = android.provider.Settings.System.getUriFor("screen_brightness");    android.provider.Settings.System.putInt(contentResolver, "screen_brightness" , brightnessValue);    contentResolver.notifyChange(uri, null);}

這樣, 最終效果就OK了, 即使退出當前應用, 手機依然是所設置的較低亮度. 當然, 退出應用前應當恢復正常的亮度和設置, 于是就利用保存的亮度值重新設置, 然后將新的亮度值再次保存到手機中即可, 別忘了, 手機之前是打開亮度自動調節的話, 還要重新打開自動調節.

2. 自定義Theme.(最常用的方法)

自定義View, 相信很多人都很熟悉. 而自定義Theme跟這個類似, 也是實現夜間模式最常用的方法, 因為它不止可以實現夜間模式, 還能實現常見的主題更換功能. 這里就不細說, 只講思路. 假設我們的應用界面是白色背景, 黑色文字, 夜間模式就是黑色背景, 灰白色的文字. 這種夜間模式有別于第一種的調節亮度, 由于背景和內容文字可以隨意的設置顏色和透明度, 這種夜間模式看起來更直觀,也可以更舒服.

自定義Theme利用的是, 在XML中定義要用到的背景和文字顏色屬性, 比如:

<declare-styleable name="MyThemeAttrs">  <attr name="activity_background" format="color" />  <attr name="text_color" format="color" /></declare-styleable>

然后在style.xml中創建自己的兩個主題(Theme), 比如默認主題和夜間主題, 默認主題中給activity_background屬性設為白色, text_color屬性設為黑色, 夜間主題則分別為黑色和灰白色. 在View的layout文件中, 給所用的背景View, 比如某個RelativeLayout的backgroundColor屬性設為"?activity_background", TextView的textColor設為"?text_color"即可. 當然, 由于這是Theme, 在Activity開始初始化視圖前去應用才能生效. 因此最好自己封裝一個主題工具類, 在Activity的setContentView( ) 方法之前調用setTheme() 方法去設置主題.

3. WindowManager實現遮罩模式

這里, 我們應當明白一個概念, 當不必深究, window(窗口). Android的設計理念中, 給幾乎每個顯示的組件都設置包含在一個window中. Activity也有它自己的window. 通過在window添加一層灰黑色有一定透明度的view, 使它看起來是屏幕變暗了, 當然實際上手機的亮度是沒有變化的, 這種實現, 可以叫"遮罩", 類似相機拍照時在鏡頭套一層膜或者鏡片上去, 使呈現的效果有所不同. 但是這種方法, 也有不好的地方, 就是類似上面說的單獨在每個Activity去設置它的亮度. 這里每進入一個界面就需要重新"套一層view"上去, 相對"一勞永逸"的方法而言, 顯得沒優勢. 那么直接上代碼:

WindowManager manager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);WindowManager.LayoutParams params = new WindowManager.LayoutParams(    WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT,    WindowManager.LayoutParams.TYPE_APPLICATION,    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,    PixelFormat.TRANSLUCENT);params.gravity = Gravity.TOP;params.y = 10;// 距離底部的距離是10像素 如果是 top 就是距離top是10像素TextView tv = new TextView(this);tv.setBackgroundColor(0x55000000);manager.addView(tv,params);

代碼中, 通過WindowManager.LayoutParams的參數設置, 禁止所添加遮罩層的觸摸和聚焦. 這樣使得即使添上一層View, 也不會影響Activity視圖中的組件正常使用.

其實上面三種方法, 放在現在來看, 都不是新的技術, 而網上我也看過很多相關的代碼, 這里這只是放在一起做個對比和總結. 上面根據三種實現方法說了各自的特點, 綜合而言, 第一, 二種方法比較可取, 而究竟選擇第一還是第二種方法, 應該看具體需求, 如果你的應用只是簡單的要求降低亮度, 不想修改太多的代碼, 那么第一種會比較適合; 如果希望有良好的體驗, 希望看起來更酷, 甚至還想添加其他的主題, 比如藍色, 綠色的主題等等, 那么無疑第二種是最好的選擇. 自定義屬性的廣泛應用, 給我們實現更個性化的視覺效果(比如自定義組件, 自定義主題等)提供了便利.

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android開發入門與進階教程》、《Android調試技巧與常見問題解決方法匯總》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結

希望本文所述對大家Android程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 左云县| 阳山县| 射阳县| 鄂温| 曲麻莱县| 利川市| 乐安县| 隆德县| 汉川市| 陇西县| 漯河市| 新建县| 佛山市| 台山市| 克东县| 扎兰屯市| 定南县| 寿阳县| 汽车| 沅陵县| 墨脱县| 孟津县| 广灵县| 大连市| 福安市| 临泽县| 视频| 和田市| 绥化市| 铜陵市| 舞阳县| 平潭县| 临湘市| 江北区| 湾仔区| 开远市| 容城县| 利辛县| 平湖市| 桐柏县| 上饶县|