Android夜间模式切换记录

使用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这个主题或者它的子主题才支持白夜间模式的切换

 
    
调用切换模式

代码调用切换模式,设置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();

动画样式:



    



    

加入动画的效果:

夜间切换效果

其他

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夜间模式切换记录)