編輯:關於Android編程
隨著APP實現的功能越來越豐富, 看小說看視頻上網等等, 現在不少人花在手機平板等移動終端上的時間越來越長了. 但手機和平板的屏幕並不像Kindle那類電紙書的水墨屏那麼耐看, 由於自發光的屏幕特性, 我們長期盯著屏幕看容易眼睛酸痛疲倦, 因此各種護目模式, 夜間模式在移動APP上得到廣泛應用, 這的確也是一個貼心的小功能. 所以這次我們探討下幾種實現方式, 一起學習總結下:
當夜間使用手機等終端, 直接降低屏幕亮度, 能減少光線強度對眼鏡的刺激, 這也是最簡單, 也相對有效的方式.
請先添加相應權限:
通過設置屏幕亮度來實現的方法, 有兩種:
一般, 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, 比如入口Activity去設置整個手機的亮度. 由於已經設置手機全局的亮度, 那麼後面無論跳轉到哪個界面, 甚至退出程序, 手機的亮度依然是所設置的亮度. 這種方法相對第一種而言算是一勞永逸. 但這裡我們先要理清思路, 考慮好幾個點:
打開應用後, 獲取手機原來的亮度值並保存它(可用於退出應用後恢復正常亮度) ---> 如果手機打開自動亮度調節則關閉自動調節, 然後設置合適的較低亮度 ---> 將設置的亮度值應用到手機中 ---> 最後,退出應用時利用保存的原亮度值恢復原來亮度, 並重新打開手機的自動亮度調節.
接下來, 貼上關鍵代碼:
首先是獲取手機屏幕亮度值:
/**
* 獲取當前系統亮度
*
獲取失敗返回-1,獲取成功返回正常非負數
* @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;
}
然後檢測手機是否打開亮度自動調節的開關:
/**
* 是否打開自動調節亮度
* @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);
}
自定義View, 相信很多人都很熟悉. 而自定義Theme跟這個類似, 也是實現夜間模式最常用的方法, 因為它不止可以實現夜間模式, 還能實現常見的主題更換功能. 這裡就不細說, 只講思路. 假設我們的應用界面是白色背景, 黑色文字, 夜間模式就是黑色背景, 灰白色的文字. 這種夜間模式有別於第一種的調節亮度, 由於背景和內容文字可以隨意的設置顏色和透明度, 這種夜間模式看起來更直觀,也可以更舒服.
自定義Theme利用的是, 在XML中定義要用到的背景和文字顏色屬性, 比如:
這裡, 我們應當明白一個概念, 當不必深究, 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);
其實上面三種方法, 放在現在來看, 都不是新的技術, 而網上我也看過很多相關的代碼, 這裡這只是放在一起做個對比和總結. 上面根據三種實現方法說了各自的特點, 綜合而言, 第一, 二種方法比較可取, 而究竟選擇第一還是第二種方法, 應該看具體需求, 如果你的應用只是簡單的要求降低亮度, 不想修改太多的代碼, 那麼第一種會比較適合; 如果希望有良好的體驗, 希望看起來更酷, 甚至還想添加其他的主題, 比如藍色, 綠色的主題等等, 那麼無疑第二種是最好的選擇. 自定義屬性的廣泛應用, 給我們實現更個性化的視覺效果(比如自定義組件, 自定義主題等)提供了便利.
Android 中TabLayout自定義選擇背景滑塊的實例代碼
TabLayout是Android 的Material Design包中的一個控件,可以和V4包中的ViewPager搭配產生一個聯動的效果。這裡我自定義了一
Android 性能優化 內存優化之How Android Managers Memory(一)
前言在學習Android內存性能優化時,發現需要對Android系統的內存概況得有個概況了解,便有了此篇文章。這篇文章僅僅介紹相關於內存的,即輔助理解 官方文檔 How
自定義字母索引View
在聯系人,好友等列表中,為了能夠快速的根據名稱查找到相應的聯系人或者好友,通常會建立一個可以根據字母快速定位名稱的View。如下圖中右邊字母表所示:1.自定義View關於
Android特效之水波紋的實現
前言水波紋特效,想必大家或多或少見過,在我的印象中,大致有如下幾種: 支付寶 咻咻咻 式