随着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实现夜间模式小结相关推荐

  1. android menu夜间模式,Android常用技巧夜间模式开发浅析

    前言 Android的夜间模式主要主用于阅读方面,在QQ,微信读书,新闻阅读类一般会有相应的功能,本文主要介绍整体APP的夜间模式以及webview中夜间模式的实现. 效果图展示 功能实现简介 APP ...

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

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

  3. android官方夜间模式,Android夜间模式实践

    前言 由于项目需要,近段时间开发的夜间模式功能.主流的方案如下: 1.通过切换theme实现 2.通过resource id映射实现 3.通过Android Support Library的实现 方案 ...

  4. Android中夜间模式的三种实现方式

    参考:https://www.jianshu.com/p/f3aaed57fa15 在本篇文章中给出了三种实现日间/夜间模式切换的方案: 使用 setTheme 的方法让 Activity 重新设置主 ...

  5. android自动夜间模式,Android实现日夜间模式的深入理解

    在本篇文章中给出了三种实现日间/夜间模式切换的方案,三种方案综合起来可能导致文章的篇幅过长,请耐心阅读. 1.使用 setTheme的方法让 Activity重新设置主题: 2.设置 Android ...

  6. android自动夜间模式吗,Android夜间模式的实现方案

    原标题:Android夜间模式的实现方案 作者简介 本篇来自 Sunlight1024的投稿,详细地讲解了关于Android应用的夜间模式的实现,希望大家喜欢! Sunlight1024的博客地址: ...

  7. android studio夜间模式,android studio怎样实现夜间模式

    满意答案 noxlqub 2016.05.01 采纳率:51%    等级:7 已帮助:210人 关于阅读类的app,有个夜间模式真是太重要了. 那么有两种方式可以实现夜间模式 1:修改theme,重 ...

  8. android切换夜间模式吗,Android切换夜间模式

    1.设置主题DayNight 2.保证Activity继承AppCompatActivity 3.添加夜间模式对应的资源文件 此处最好把对应的color.drawable都设置相应的夜间资源,遇到过在 ...

  9. Android自动启用夜间模式,Android – 切换夜间模式

    什么是夜间主题以及如何在ANDROID中使用它? Support Library 23.2(应用于API14+)推出了适合Android Apps的DayNight主题,它将根据时间和用户最后一次提供 ...

最新文章

  1. WPF:WPF显示PDF文档 之 编译 MoonPdfLib库
  2. ICLR 2022 | 在注意力中重新思考Softmax,商汤提出cosFormer实现多项SOTA
  3. 为什么Spring Boot项目引入依赖的时候可以不指定依赖的版本号
  4. Kettle使用_7 数据校验组件应用
  5. 计算机的颜色储存格式(索引色 真彩色)
  6. hdu 4497 GCD and LCM
  7. python多线程文件的数据续传_python实现支持并发、断点续传的Ftp程序
  8. powerpoint 2016表格中添加行
  9. git查看某次commit的修改
  10. 2016 java排名_Java计算成绩平均值和排名
  11. mt4 谐波_MT4指标Harmonic Dasboard — 外汇谐波仪表盘交易系统
  12. 用iMindMap制作健康生活计划思维导图
  13. mac软件推荐,支持m1(持续更新)
  14. 【2022】APP-IOS客户端Android客户端安全性测试-常见问题
  15. ArcGIS数据生产与精细化制图之中国年降水量分布图的制作(转载)
  16. android如何区分模拟器和真机
  17. Emacs footnote 自动排序
  18. Mac系统安装软件的三种方式
  19. 采购月度业绩贡献度报表
  20. CSS真好玩——用纯CSS画一轮新月

热门文章

  1. Paint、Canvas、Matrix使用讲解
  2. linux高危漏洞怎么处理,Struts2高危漏洞解决方案一览
  3. win2003服务器漏洞要修复吗,微软紧急发布Windows远程桌面高危漏洞补丁 涉及XP 2003...
  4. Advanced: Making Dynamic Decisions and the Bi-LSTM CRF(对官网发的代码的一些理解~,来自看不懂英文也没学过前置课程的小白两周的心血)
  5. 视频编解码----NTSC制式和PAL制式的区别
  6. Python人工智能概述——博弈、对抗搜索
  7. Redis快速入门——你确定不来瞅瞅?
  8. 正规方程,梯度下降,岭回归——机器学习
  9. 时间紧迫的任务对于珠宝照片集分配与Packshotcreator数码灯箱
  10. springboot 配置项加密