闲的没事,寻思着写个博客吧.
项目上周准备开个日夜间 功能,花了很长时间找到合适的了,效果还不错,可惜要留到第二版了.
日夜间模式:网上能给到的很常见的就有三种,Android自带俩种,第三种其实就是自己监听点击事件了,,,,各种设置
这里推荐两种:蒙层!
https://blog.csdn.net/u013478336/article/details/52484322
WindowManager manager = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT ,WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION ,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP;
params.y = 10 ;
TextView tv = new TextView( this);
tv.setBackgroundColor(0xAA000000 );
manager.addView(tv,params);
完全可以用,但是也有Bug 很难在多个不同界面实现遮盖,可以通过add remove 也可以通过 这个tv的显示隐藏,如果你的项目只有一个Activity,完全可以用蒙层
第二种:拿来
拿来奥义之术: 粘门 开!
有点逗比,但是我乐意啊
https://github.com/ximsfei/Android-skin-support
流程具体说说:
1.准备除了项目的现有drawable(想换换,不换拉倒),color(必须),再准备最少1套资源颜色 的Name 都统统对应上,比如项目上是白天的颜色,夜间模式color的值就换个对应的夜间的颜色
2.依赖
implementation 'skin.support:skin-support:3.1.0-beta1' // skin-support 基础控件支持
implementation 'skin.support:skin-support-design:3.1.0-beta1' // skin-support-design material design 控件支持[可选]
implementation 'skin.support:skin-support-cardview:3.1.0-beta1' // skin-support-cardview CardView 控件支持[可选]
implementation 'skin.support:skin-support-constraint-layout:3.1.0-beta1' // skin-support-constraint-layout ConstraintLayout 控件支持[可选]
如果你的项目不差这几K,那就别选不选的了,全放上吧
3.初始化Application
@Override
public void onCreate() {
super.onCreate();
SkinCompatManager.withoutActivity(this) // 基础控件换肤初始化
.addInflater(new SkinMaterialViewInflater()) // material design 控件换肤初始化[可选]
.addInflater(new SkinConstraintViewInflater()) // ConstraintLayout 控件换肤初始化[可选]
.addInflater(new SkinCardViewInflater()) // CardView v7 控件换肤初始化[可选]
.setSkinStatusBarColorEnable(false) // 关闭状态栏换肤,默认打开[可选]
.setSkinWindowBackgroundEnable(false) // 关闭windowBackground换肤,默认打开[可选]
.loadSkin();
}
4.开始粘
SkinCompatManager.getInstance().loadSkin("night.skin", null, SKIN_LOADER_STRATEGY_ASSETS);//加载夜间模式 这个不闪屏啥的
第一个参数:文件
第二个:监听
第三个:加载策略 这里放上的 大致意思就是加载本地asset文件下的文件
其实这个库就是通过安卓加载dex文件,读取文件的资源进行替换使用
这个是我想象的,反正感觉肯定是类加载机制 classLoader/dexloader,就那俩种,类似的机制吧.
5.做文件
建个moudle
把另一套color/资源 啥的都放上,然后,第四个,然后在你这个moudle的build,outputs,找到一个.apk文件,然后改个名,随便起,一般都是上面那个.skin结尾,防止重复么.然后,在你的项目main /assets 把这个放进去,OK了.调用方法第一个参数名字传对啊,完事