随着APP实现的功能越来越丰富, 看小说看视频上网等等, 如今不少人花在手机平板等移动终端上的时间越来越长了. 但手机和平板的屏幕并不像Kindle那类电纸书的水墨屏那么耐看, 因为自发光的屏幕特性, 我们长期盯着屏幕看easy眼睛酸痛疲倦, 因此各种护目模式, 夜间模式在移动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实现夜间模式小结的更多相关文章

  1. Android白天/夜间模式Day/Night Mode标准原生SDK实现

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...

  2. Android 之夜间模式(多主题)的实现

    引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...

  3. Android实现夜间模式

    如今非常多App都有夜间模式,特别是阅读类的App.夜间模式如今已经是阅读类App的标配了,其实,日间模式与夜间模式就是给App定义并应用两套不同颜色的主题,用户能够自己主动或者手动的开启,今天用An ...

  4. 【android】夜间模式简单实现

    完整代码,请参考我的博客园客户端,git地址:http://git.oschina.net/yso/CNBlogs 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1: ...

  5. Android 夜间模式的实现

    package com.loaderman.daynightdemo; import android.os.Bundle; import android.support.v7.app.AppCompa ...

  6. Android 夜间模式changeskin小结

    @author vivian8725118 @CSDN http://blog.csdn.net/vivian8725118 @简书 http://www.jianshu.com/p/832e9776 ...

  7. android夜间模式实现

    一.概述 android夜间模式实现分为两大类 重启activity的实现 不重启activity的实现 二.正文 1.重启activity实现夜间模式[在界面文件中的实现部分] 1.1在attrs. ...

  8. android简单的夜间模式

    现在android项目values下打 attrs.xml <?xml version="1.0" encoding="utf-8"?> <r ...

  9. Android夜间模式的几种实现

    一.直接修改widget颜色,这种方式实现起来最简单,但需要每个控件都去修改,太过复杂.例如: /** * 相应交互,修改控件颜色 * @param view */public void onMeth ...

随机推荐

  1. poj3693(后缀数组)

    poj3693 题意 给出一个串,求重复次数最多的连续重复子串,输出字典序最小的. 分析 论文 例8(P21). Sparse-Table算法预处理出任意两个后缀串的LCP. code #includ ...

  2. Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊

    Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ...

  3. Linux下分区、格式化、自动挂载

    说明:现在硬盘基本没有了IDE,所以基本是从SCSI开始说起,第一块硬盘标示为sda,第二块为sdb,以此类推.那么第一块硬盘的第一个分区为sda1,也是以此类推. 一.硬盘分区 sudo fdisk ...

  4. 转换vmware的vmdk格式到qcow2或者raw格式

    qemu-img convert  xxxx-disk1.vmdk -f  vmdk  -O qcow2 xxxx-disk1.qcow2 qemu-img convert xxxx-disk1.vm ...

  5. [置顶] kubernetes资源类型--Volume

    在Docker的设计实现中,容器中的数据是临时的,即当容器被销毁时,其中的数据将会丢失.如果需要持久化数据,需要使用Docker数据卷挂载宿主机上的文件或者目录到容器中.在K8S中,当Pod重建的时候 ...

  6. Android.mk入门(一)

    Android.mk是Android工程管理文件,其作用基本等同于Linux环境中的Makefile,在语法上,Android.mk和普通Makefile略有不同,主要区别是Android.mk包含一 ...

  7. Spring注释事务失效及解决办法

    如果带上事务,那么用annotation方式的事务注解和bean配置,事务会失效,要将service bean配置到xml文件中才行  在主容器中(applicationContext.xml),将C ...

  8. zabbix监控php-fpm

    1.启用php-fpm的状态功能 [root@web01 ~]# vim /etc/php-fpm.d/www.conf 121 pm.status_path = /php_status [root@ ...

  9. iptables 的学习资源

    慕课网:https://www.imooc.com/video/7617 马哥linux视频:http://edu.51cto.com//center/course/lesson/index?id=9 ...

  10. 转:myeclipse和eclipse的区别和联系,以及版本间的对应关系

    myeclipse和eclipse的区别和联系,以及版本间的对应关系 Eclipse:IBM花了4千万美金来开发这个IDE(Integrated Development Environment).第一 ...