美文网首页
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