最近项目中要实现夜间模式,调研了几种Android的夜间模式实现方式,都是需要动态的改变ui界面引用到color、drawable等资源文件。由于这个项目是迭代了比较多版本的,ui界面比较多,项目也比较大了要每个界面都去重新梳理一遍字体颜色的改变逻辑,drawable资源的引用逻辑这个工作量是很大的,但是没办法要实现不同的界面风格这个工作是一定要做的。有一些夜间模式的实现方式是通过下载zip包来拿到不同的皮肤资源,有些是通过下载apk文件再拿到它的context获取里面drawable等资源。这些都需要自己去另外写资源的下载和加载逻辑,当然这种实现方式可以更换多种皮肤,如果是项目从0到1开始开发这种方式是不错的。但是考虑到时间成本就选了使用Support Library包中添加的夜间模式主题,简单粗暴。

    首先activity继承于AppCompatActivity ,然后将style.xml中的主题样式改为Theme.AppCompat.DayNight,最后就是在application中调用AppCompatDelegate.setDefaultNightMode(int mode)设置日夜间模式,其中mode 有4个值可选分别是:
                    MODE_NIGHT_NO: 使用亮色(light)主题,不使用夜间模式
                    MODE_NIGHT_YES:使用暗色(dark)主题,使用夜间模式
                    MODE_NIGHT_AUTO:根据当前时间自动切换 亮色(light)/暗色(dark)主题
                    MODE_NIGHT_FOLLOW_SYSTEM(默认选项):设置为跟随系统,通常为 MODE_NIGHT_NO
   接下来就是苦逼的更换资源工作了。需要在对应的资源目录下创建-night目录,如:drawable 对应夜间模式 drawable-night,value对应夜间模式 value-night,而且里面的item项的文件名要一致。

     在调用AppCompatDelegate.setDefaultNightMode(int mode)更改模式后需要调用recreate()方法才会生效,这时候会有个坑,就是会闪屏。像华为荣耀这些手机会闪的很厉害,小米会相对好点。后来想了个掩盖闪屏的方案,在调用recreate()方法前先打开一个半透明的activity,然后延迟1s左右消失,给它一个透明度渐变消失的动画,效果还不错。如下面的代码:

        if (isNightMode != VoiceApplication.getInstance().isAppNightMode()) {            startActivity(new Intent(this, NightModeChangeMaskActivity.class));            overridePendingTransition(R.anim.alpha_in, R.anim.alpha_out);            recreate();            isNightMode = VoiceApplication.getInstance().isAppNightMode();        }
public class NightModeChangeMaskActivity extends BaseActivity {    @Override    protected int getStatusBarColorRes() {        return R.color.night_mode_mask_color;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_night_mode_change_mask);        Single.timer(1000, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())                .compose(bindUntilEvent(ActivityEvent.DESTROY))                .subscribe(aLong -> {                    finish();                });    }    @Override    protected void onDestroy() {        super.onDestroy();    }    @Override    public void finish() {        super.finish();        overridePendingTransition(0, R.anim.alpha_out);    }}

这里主要是记录下实现夜间模式的实现方式和日夜间解决切换时闪屏的解决方案,做个笔记吧。

更多相关文章

  1. Android(安卓)XML解析Pull方式———解析网络数据示例
  2. Android(安卓)内容提供器---创建内容提供器(设计内容资源标识(URI))
  3. 详解Android中那些酷炫返回方式的实现
  4. 番外篇 之 实现Unity和Android进行交互(基于Android(安卓)Studio
  5. Qt on Android(安卓)实现App普通全屏、沉浸模式、粘性沉浸模式
  6. Assets 与 Res android的两大资源的获取 与android studio中asse
  7. 【Android(安卓)界面效果17】Android手机平板两不误,使用Fragment
  8. Android(安卓)IPC【Inter-Process Communication】机制二【Andro
  9. android创建快捷方式来打开应用中特定的Activity

随机推荐

  1. android的Handler
  2. Android系统编译系统分析大全(一)
  3. Visual Studio跨平台开发实战(4) - Xamar
  4. Unity调用Android配置方法
  5. 最全的PHP开发Android应用程序
  6. Android顶部工具栏和底部工具栏的简单实
  7. Android: 你必须掌握的Android命令
  8. [android]控件ImageView的常用属性
  9. Mono for Android(安卓)V1.0 正式发布啦!
  10. LinearLayout中实现水平方向上的两个text