Android实现夜间模式(基于Support Library)

1:在build.gradle里面引入Support Library包:

compile('com.android.support:appcompat-v7:26.1.0') { exclude module: 'support-v4'}

2:在styles文件里面自定义白天和夜晚两种主题,
首先 新建两个文件夹,分别为:values-night和drawable-night,目录结构如下:


K`30([TS0RW]AILC1E0X%8B.png

2.1:白天主题,在res/values/styles文件里面,例如:

 <style name="CarnocTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
  </style>
  <style name="CarnocTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

2.2:夜晚主题,在res/values-night/styles定义,例如:

<style name="CarnocTheme" parent="Theme.AppCompat.DayNight">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/accent</item>
 </style>

此处的颜色均在color.xml文件定义的,因为有两种显示方式,所以可能存在日、夜两种主题下,两份颜色定义,具体看第三步介绍。此处只是实例,可不必粘贴在代码里面,在第三步统一操作;

   <color name="primary">#2196F3</color>
   <color name="primary_dark">#1976D2</color>
   <color name="accent">@color/primary</color>

三种颜色代表的意思如下图所示:


20161019114428989.png

3:定义颜色、图片、点击效果等两种效果,一个为夜间模式下,另一个为正常模式下的;
3.1:颜色,普通模式下的颜色和通常颜色定义一样,定义在res/values/colors.xml文件里面,如下:

   <color name="primary">#2196F3</color>
    <color name="primary_dark">#1976D2</color>
    <color name="accent">@color/primary</color>
    <color name="text_color_topleft">#333333</color>
    <color name="text_color_topcenter">#4e4e4e</color>
    <color name="line_color_top">#d8d8d8</color>
    <color name="text_color_noimg">#aaaaaa</color>
    <color name="listview_item_color1">#FFFFFF</color>
    <color name="listview_item_color2">#eeeeee</color>

夜间模式下的颜色定义在res/values-night/color.xml文件里面,例如:

 <color name="primary">#2196F3</color>
    <color name="primary_dark">#191A1E</color>
    <color name="accent">@color/primary</color>
    <color name="frament_usercenter_bgcolor">#191A1E</color>
    <color name="topbar_bg">#191A1E</color>
    <color name="text_color_topleft">#8E8F91</color>
    <color name="text_color_topcenter">#8E8F91</color>
    <color name="line_color_top">#07080A</color>
    <color name="listview_item_color1">#07080A</color>
    <color name="listview_item_color2">#191A1E</color>

由于前三个颜色在主题里面有用到,必须定义,name也必须跟之前的一模一样,颜色可以根据项目需求对颜色进行更改;其他的颜色,按照项目实际要求选择行定义,name和颜色都可以自定义的;
3.2:图片,图片很简单,只要将页面模式下的图片放到drawable-night文件夹下即可,注意必须和普通模式下的图片同名;
3.3:对于点击事件,由于夜间模式下,点击效果展示的颜色也和普通模式下有区别,所以需要定义两份,将普通的点击效果文件复制到drawable-night文件夹下,例如我有一份普通模式下的文件点击效果,listview_item_selector.xml,代码如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@color/listview_item_color1" android:state_pressed="false"/>
    <item android:drawable="@color/listview_item_color2" android:state_pressed="true"/>

</selector>

无论是drawable/listview_item_selector.xml文件还是drawable-night/listview_item_selector.xml 代码、文件名都是一样的,但是具体里面的item定义文件的颜色,需要在res/values/colors.xml以及res/values-night/color.xml定义两份.具体代码,已经在3.1里面讲过了。

到这里,基本的资源文件定义,主题定义,已经结束了,接下来就是如何应用到项目里面:
4:应用定义的资源、主题到项目
4.1:AndroidManifest.xml文件应用主题,直接在<application>里面进行属性配置即可:

 <application
       ......
        android:theme="@style/CarnocTheme.NoActionBar"
       .........
>
..........
..........
 </application>

4.2:在application的onCreat()方法里面初始化主题,这里的CacheUINightMode只是一个本地自定义的存储文件SharedPreferences,用来缓存用户之前选择的主题,true代表夜间;

if (CacheUINightMode.getData(this)) {
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        } else{
          AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }

具体设置页面,按钮在点击切换模式时,代码如下,已解决卡顿问题:

slipBtnNight.setOnCheckedChangeListener(new SwitchView.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(boolean isChecked)
            {
                if (isChecked && !CacheUINightMode.getData(UserCenter_SettingActivity.this))
                {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
                    CacheUINightMode.saveData(UserCenter_SettingActivity.this, true);
                    startActivity(new Intent(UserCenter_SettingActivity.this,UserCenter_SettingActivity.class));
                    overridePendingTransition(R.anim.anim_animo_alph_open,R.anim.anim_animo_alph_close);
                    finish();
                }
                else if (CacheUINightMode.getData(UserCenter_SettingActivity.this) && !isChecked)
                {
                    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
                    CacheUINightMode.saveData(UserCenter_SettingActivity.this, false);
                    startActivity(new Intent(UserCenter_SettingActivity.this,UserCenter_SettingActivity.class));
                    overridePendingTransition(R.anim.anim_animo_alph_open,R.anim.anim_animo_alph_close);
                    finish();
                }
            }
        });

动画效果代码如下:
anim_animo_alph_close.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="1.0"
        android:toAlpha="0.1"
        android:duration="800"
        android:interpolator="@android:anim/accelerate_interpolator"/>
</set>

anim_animo_alph_open.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha
        android:fromAlpha="0.1"
        android:toAlpha="1.0"
        android:duration="800"
        android:interpolator="@android:anim/accelerate_interpolator"/>
</set>

到这就彻底结束了,啦啦啦啦。。。第一次写技术文章,好紧张。。。。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,049评论 25 707
  • 前言 随着一款APP应用功能的不断完善,用户群体的不断增多,APP的更新也就不仅仅局限于功能需求,如何做好良好的用...
    采蘑菇的里奥马阅读 27,766评论 43 146
  • 夜幕降临,他走在马路上,回想着今天发生的一切,他不敢相信事情就这样发生了。他最终还是决定拨打那个电话,掏出手机,解...
    章鱼老王阅读 9,788评论 9 49
  • 在中国,每年的4月1号除了是愚人节之外,还是哥哥张国荣的忌日,而哥哥张国荣就是因为抑郁症才去世的,今年前不久一位偶...
    李说阅读 147评论 0 1
  • 读过很多故事,依旧写不出故事会。 2015年7月28日,我光荣加入千字计划群,并开始按约履行每一项规定。 我向来是...
    9号刘俊利阅读 297评论 0 1