一、背景
在阅读软件或者儿童软件都需要护眼模式来降低蓝光的辐射。
二、实现方案
- 首先在每个activity创建的时候在最上层添加一层view,去掉点击事件。
- 用sp或者mmkv来存储当前是否打开护眼模式。
- 在每次activity onresume的时候去check护眼模式的状态,护眼模式处于打开状态把view的背景设置成护眼的颜色。
三、代码实现
1、首先注册一个activity生命周期监听器,然后在onCreate的时候添加护眼view蒙层,在onResume的时候去check护眼模式的状态。
/**
* activity 生命周期监听器
*/
private var mActivityLifecycleCallbacks = object : Application.ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
if (isEyeComfortEnabled()) {
ViewUtils.openEyeComfort(activity, R.id.eye_comfort_view_id)
} else {
ViewUtils.closeEyeComfort(activity, R.id.eye_comfort_view_id)
}
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
override fun onActivityPostCreated(activity: Activity, savedInstanceState: Bundle?) {
//在每个activity创建的时候加护眼蒙层
ViewUtils.addEyeComfortView(activity, R.id.eye_comfort_view_id)
if (isEyeComfortEnabled()) {
ViewUtils.openEyeComfort(activity, R.id.eye_comfort_view_id)
} else {
ViewUtils.closeEyeComfort(activity, R.id.eye_comfort_view_id)
}
}
}
mApplication.registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks)
2、添加蒙层,打开护眼模式,关闭护眼模式代码如下:
/**
* 添加护眼蒙层
*
* @param activity activity界面
*/
public static void addEyeComfortView(Activity activity, int id) {
ViewGroup content = activity.findViewById(android.R.id.content);
//创建盟层view用来做护眼模式
View eyeComfortView = new FrameLayout(activity);
eyeComfortView.setId(id);
eyeComfortView.setBackgroundColor(Color.TRANSPARENT);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
//设置view为不可定焦,不可触
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
//设置充满全屏幕
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
content.addView(eyeComfortView, params);
}
/**
* 打开护眼模式
*
* @param activity activity界面
* @param id view id
*/
public static void openEyeComfort(Activity activity, int id) {
View eyeComfortView = activity.findViewById(id);
eyeComfortView.setBackgroundColor(IHColorUtils.INSTANCE.getEyeComfortColor(50));
}
/**
* 关闭护眼模式
*
* @param activity activity界面
* @param id view id
*/
public static void closeEyeComfort(Activity activity, int id) {
View eyeComfortView = activity.findViewById(id);
eyeComfortView.setBackgroundColor(Color.TRANSPARENT);
}