本文实例讲述了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_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程序设计有所帮助。
您可能感兴趣的文章:android基础教程之夜间模式实现示例Android实现日夜间模式的深入理解Android夜间模式最佳实践Android 实现夜间模式的快速简单方法实例详解三行Android代码实现白天夜间模式流畅切换Android主题切换之探究白天和夜间模式Android实现夜间模式切换功能实现代码Android 夜间模式的实现代码示例 总结以上是内存溢出为你收集整理的Android编程实现夜间模式的方法小结全部内容,希望文章能够帮你解决Android编程实现夜间模式的方法小结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)