美文网首页
Android夜间模式切换记录

Android夜间模式切换记录

作者: wenou | 来源:发表于2018-02-07 11:40 被阅读107次

    使用AndroidSDK自带的support lib来实现APP日间/夜间模式的切换

    添加依赖包appcompat-v7

    在app module的gradle中依赖appcompat库,版本最低是23.2.0

    implementation 'com.android.support:appcompat-v7:26.1.0'
    
    修改Application的theme样式

    Theme.AppCompat.Light 修改为Theme.AppCompat.DayNight
    就是Light改为DayNight,DayNight这个主题或者它的子主题才支持白夜间模式的切换

     <!--<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">-->
        <style name="AppTheme" parent="Theme.AppCompat.DayNight.DarkActionBar">
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    
    调用切换模式

    代码调用切换模式,设置AppCompatDelegate.MODE_NIGHT_YES或者AppCompatDelegate.MODE_NIGHT_NO来控制切换

     AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    

    简单使用:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void click(View v){
            int mode = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
            if (mode == Configuration.UI_MODE_NIGHT_YES) {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
            } else {
                AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
            }
            getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut);
            recreate();
        }
    }
    

    通过上面的方式调用就能进行夜间模式切换,但是会出现闪动:


    GIF.gif

    可以设置一个转化的动画:

    //AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
    getWindow().setWindowAnimations(R.style.WindowAnimationFadeInOut);
    recreate();
    

    动画样式:

    <style name="WindowAnimationFadeInOut">
            <item name="android:windowEnterAnimation">@anim/fade_in</item>
            <item name="android:windowExitAnimation">@anim/fade_out</item>
        </style>
    
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha
            android:duration="1000"
            android:fromAlpha="0"
            android:interpolator="@android:anim/decelerate_interpolator"
            android:toAlpha="1.0"/>
    </set>
    
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <alpha
            android:duration="1500"
            android:fromAlpha="1.0"
            android:interpolator="@android:anim/decelerate_interpolator"
            android:toAlpha="0"/>
    </set>
    

    加入动画的效果:

    夜间切换效果
    其他

    1.如果想给不同的模式设置不同的color ,需要新建一个values-night的文件夹来兼容
    2.如果想给不同的view设置不同的样式,可以建不同的style,给不同的view引用

    动态切换皮肤:
    实现自己的一套动态切换皮肤功能

    注意

    1.app或者activity引用的style需要是Theme.AppCompat.DayNight或者它的子style
    2.调用getDelegate().setLocalNightMode()的Activity必须是继承AppCompatActivity

    参考文章:http://blog.csdn.net/yanzhenjie1003/article/details/52464363

    相关文章

      网友评论

          本文标题:Android夜间模式切换记录

          本文链接:https://www.haomeiwen.com/subject/mveozxtx.html