`
砺雪凝霜
  • 浏览: 157081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对android夜间模式实现的探讨

阅读更多

 

       前段时间写了一篇关于android夜间模式的博客地址是:http://1029457926.iteye.com/blog/2202106,原理是在Activity的启动之前判断是否是黑夜模式,然后调用setTheme方法来设置相应的布局。下面讲讲如何用代码来实现:

 

      原理都差不多都是根据当前app是否是模式(白天和黑夜),然后去改变控件的属性。

     步骤如下:

      1 为View准备白天和黑夜的2种不同的属性布局

    一个线性布局可能白天的背景和黑夜的背景都是不同,还有一个TextView的字体颜色白天和黑夜也可能不同。所以我们要先准备2套View的白天黑夜的不同属性配置。为了便于管理可以把这些属性放在2个文件夹下:

 

    

 

   2 接下来就在代码中实现各种属性的白天黑夜的切换了

 

         项目中白天黑夜切换的属性比较多,如textColor,background,图片的src,甚至是字体的大小,具体当然要看项目的需求。所以最好把这些方法封装放在一个工具类中,每当Activity

setContentView之后,我们可以调用这些方法,就可以实现切换了。

 

   2.1 动态改变View的background属性

 

     原理:先从sharePreference中取出当前的模式,判断当前是白天模式还是黑夜模式(默认是白天模式),如果是白天模式就给View设置白天的背景颜色,反之就设置View的黑夜的背景。

 

 public static void setDrawableBackground(final View view, int idLight, int idNight) {

        try {

            Drawable drawable;

            if (SnsUtil.isThemeDefault()) {

                drawable = Global.context.getResources().getDrawable(idLight);

            } else {

                drawable = Global.context.getResources().getDrawable(idNight);

            }

            view.setBackgroundDrawable(drawable);

        } catch (Exception ex) {

           

        }

    }

 

    最好加上日志处理,以便可以方便定位到异常信息,在代码中可以这样调用:

 

ThemeUtility.setDrawableBackground(iconPostUp,R.drawable.sel_top_feed_unposted_light,

 R.drawable.sel_top_feed_unposted_night);

  

   2.2 动态改变TextView的TextColor属性

 

  public static void setTextColor(final TextView tv, int idLight, int idNight) {

        ColorStateList cl;

        try {

            XmlResourceParser xpp;

            if (SnsUtil.isThemeDefault()) {

                xpp = Global.context.getResources().getXml(idLight);

            } else {

                xpp = Global.context.getResources().getXml(idNight);

            }

            cl = ColorStateList.createFromXml(Global.context.getResources(), xpp);

            tv.setTextColor(cl);

        } catch (Exception ex) {

        }

    }

 

   方法调用:

ThemeUtility.setTextColor(tvPostUpCount, R.color.sel_gray_3_light, R.color.sel_gray_3_night);

 

    如果一个app要做页面模式的话,其代价是很高的,要做2套布局,主要是图片,UI要为白天模式要切一张,黑夜模式也要切一张,app的体积自然就大了不少。当然这个代价是值得的,晚上的时候你突然打开手机看看新闻,是不是会觉得很刺眼呢?所以一般的新闻客户端都会有夜间模式。

    2.3  白天和黑夜的颜色对照表

下面给大家分享一下:

    3 夜间模式实现的优缺点比较

    实现夜间模式的方式有:

   (1) 用布局文件来实现

       优点:这种方法实现非常简单,只需配置2套布局即可,写的代码非常少。

        缺点:内存消耗大,用户体验不好

      项目中我们就是这么实现的,但是只能在setContentView之前调用setTheme方法来改变当前模式,如果当用户由白天切换到黑夜之后,按返回键你会发现,原来的页面还是白天模式,只有onResume方法中通过重新启动Activity才切换到黑夜模式(重新调用了一次setTheme方法),但是有时候会出现闪屏的现象。

 

   (2)全部由代码来实现

      优点:bug少,用户体验好

      这种方法我相信开始的时候大部分程序员都不会采用,要为很多View设置变化样

 式,这无形中就增加了不少的代码。当在模式切换后,按返回键,为了在显示出来的Activity中看到模式切换后的样式,第一种方法要重启Activity,但是第二种方法,完全不用考虑这些。这样既避免了闪屏,又避免了Activity的再次启动,提升了性能消耗。同时不会闪屏,用户体验会更好些。我知道的知名的新闻客户端就是通过第二种方法来实现夜间模式的,  而不是 第一种这种取巧的方法。

       缺点:代码量大。

 

      所以以后要app做黑夜模式的同学,吸取BZ的教训,采用第二种实现方法,避免以后少走点弯路。如果谁有更好的实现android夜间模式的方法,都可以来和BZ交流!

 

 

 

分享到:
评论

相关推荐

    android 夜间模式切换,颜色渐变效果实现

    总结来说,实现Android夜间模式切换并加入颜色渐变效果主要涉及以下几个步骤: 1. 创建日间和夜间主题的XML文件。 2. 在`AndroidManifest.xml`中设置默认主题。 3. 在`Application`或`Activity`中处理主题切换逻辑...

    android 夜间模式

    本篇将深入探讨如何在Android应用中实现日间与夜间模式的切换。 一、夜间模式的原理 夜间模式的基本原理是改变应用的主题或资源的颜色方案。通常,这涉及到更改UI组件的颜色值,如背景色、文字颜色等。Android系统...

    Android夜间模式

    在Android系统中,夜间模式是一项重要的功能...通过分析和理解这些代码,你可以更好地掌握Android夜间模式的实现原理和技巧。记得实践是检验真理的唯一标准,动手尝试一下,看看实际效果如何,这将有助于巩固你的知识。

    android夜间模式

    在Android平台上,夜间模式...提供的压缩包文件“android夜间模式”可能包含了实现这一功能的相关代码示例,可作为学习和参考的资源。对于初学者,研究和理解这些代码可以帮助你更好地掌握Android夜间模式的实现方式。

    Android白天夜间模式切换

    在Android开发中,实现“白天夜间模式切换”的功能是一项常见的需求,这主要涉及到UI界面的颜色搭配和用户体验的优化。在Android系统中,开发者可以利用多种技术来实现这一特性,包括自定义主题、颜色过滤以及使用...

    安卓换肤主题更换夜间模式相关-android背景的更换手动向右滑动更换资源文件里的图片.rar

    这篇文档将深入探讨如何在Android应用中实现在用户手动向右滑动时更换背景图片,以及如何结合夜间模式进行主题切换。 首先,我们需要理解Android的资源管理机制。在Android应用中,资源如图片、颜色值等通常存储在...

    android 白天夜间模式切换.rar

    在"android 白天夜间模式切换"这个主题中,我们将深入探讨如何在Android应用中实现这一功能。 1. **系统主题切换**: Android提供了系统级别的DayNight主题,允许应用在日间和夜间之间切换。开发者可以通过设置`...

    安卓换肤主题更换夜间模式相关-MultipleThemeAndroid换肤/夜间模式的Android框架.rar

    MultipleTheme Android框架专注于实现这一功能,让用户可以根据自己的喜好和环境切换不同的主题和夜间模式。本文将深入探讨这个框架的关键技术和实现方法。 首先,Android换肤是通过更换应用程序界面的颜色、图片等...

    android 日夜模式切换

    在Android应用开发中,日间模式与夜间模式的切换是一个重要的功能,特别是在追求用户体验和个性化设计的当下。本文将深入探讨如何使用Android Studio (AS) 实现这一功能,并结合一个名为"DayNightSample"的示例项目...

    android 5.0 切换主题,夜间模式

    综上所述,实现Android 5.0的夜间模式和主题切换功能需要对Material Design、主题系统以及动态资源管理有深入理解。通过合理的代码结构和设计,可以提供流畅且用户友好的体验。在提供的`SwitchThemeDemo`项目中,...

    Android应用源码之夜间模式示例.zip

    接下来,我们将深入探讨实现夜间模式的关键技术点和步骤。 首先,我们需要了解Android中的主题和样式。在Android中,主题(Themes)和样式(Styles)用于定义应用的外观和感觉。我们可以通过在`res/values/styles....

    夜间模式(源码)

    在“夜间模式(源码)”中,我们可以深入探讨以下几个关键知识点: 1. **亮度调节**:夜间模式的核心功能之一是降低屏幕亮度。这通常通过软件接口控制设备的背光亮度。在源码中,开发者会使用特定的API来调整屏幕...

    仿UC夜间模式切换

    "仿UC夜间模式切换"的主题旨在探讨如何实现类似UC浏览器的夜间模式切换效果。UC浏览器的夜间模式不仅改变了界面的色调,还优化了文字和图像的对比度,以提供更舒适的阅读体验。 首先,我们要理解夜间模式的核心概念...

    Android夜间模式最佳实践

    本文将深入探讨如何在Android中优雅地实现夜间模式,包括三种主流的实现方案,并以详细步骤解析每一种方法。 首先,我们来看第一种实现夜间模式的方法:**通过切换theme来实现**。这种方法是在`attrs.xml`文件中...

    Android应用源码之夜间模式示例-IT计算机-毕业设计.zip

    在毕业设计中,你可以基于这个示例进行深入研究,比如探讨不同切换策略的优劣,用户对夜间模式的接受度,以及如何提高夜间模式的用户体验。同时,撰写论文时,要详细介绍设计思路、实现方法、遇到的问题及解决策略...

    夜间模式Demo

    8. **兼容性**:在设计夜间模式时,需要考虑到不同平台的差异,例如Android和iOS有不同的实现方式。同时,如果应用有网页版本,也需要考虑如何在网页上实现类似的效果,如使用CSS的` prefers-color-scheme`媒体查询...

    android webView夜间模式 长按识别图片以及二维码

    本文将深入探讨如何在WebView中实现夜间模式、长按识别图片以及二维码扫描的功能。 首先,我们来讨论如何实现夜间模式。在Android的WebView中,我们可以利用CSS的媒体查询(Media Queries)来根据设备的光照条件...

    安卓换肤主题更换夜间模式相关-夜间模式设置.rar

    本压缩包文件“夜间模式设置.rar”可能包含与实现这一功能相关的源代码、配置文件或教程,虽然没有提供所有文件的详细清单,但我们可以基于提供的标签和描述来探讨安卓应用中换肤主题和夜间模式的实现原理及常见方法...

Global site tag (gtag.js) - Google Analytics