介绍三种方案全局设置灰白模式,原理都是相同的,利用Android提供的ColorMatrix(颜色矩阵),将其饱和度设置为0,这样使用Paint绘制出来的都是没有饱和度的灰白样式!
不同的方案只是设置时机不同而已。
Android实现设置灰白模式效果 - 掘金
Android APP全局黑白化实现方案_xiaoerbuyu1233的博客-CSDN博客
Application里面不是有registerActivityLifecycleCallbacks这个注册监听方法吗?监听里面的onActivityCreated不是可以获取到当前的Activity吗?那DecorView不就拿到了!
public class StudyApp extends Application {@Overridepublic void onCreate() {super.onCreate();Paint mPaint = new Paint();ColorMatrix mColorMatrix = new ColorMatrix();mColorMatrix.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {// 当Activity创建,我们拿到DecorView,使用Paint进行重绘View decorView = activity.getWindow().getDecorView();decorView.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);}....});}
}
可以在BaseActivity的onCreate方法中,使用ColorMatrix设置灰度
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//方案一Paint paint = new Paint();ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);//灰度效果paint.setColorFilter(new ColorMatrixColorFilter(cm));getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint);}
先定义一个GrayFrameLayout布局
public class GrayFrameLayout extends FrameLayout {private Paint mPaint = new Paint();public GrayFrameLayout(@NonNull Context context) {super(context);}public GrayFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(cm));}@Overrideprotected void onDraw(Canvas canvas) {canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);super.onDraw(canvas);}@Overrideprotected void dispatchDraw(Canvas canvas) {canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);super.dispatchDraw(canvas);}
}
在BaseActivity的onCreateView方法中做如下处理:
@Overridepublic View onCreateView(View parent, String name, Context context, AttributeSet attrs {//方案二if("FrameLayout".equals(name)){int attributeCount = attrs.getAttributeCount();for (int i = 0; i < attributeCount; i++) {String attributeName = attrs.getAttributeName(i);String attributeValue = attrs.getAttributeValue(i);if(attributeName.equals("id")){int id = Integer.parseInt(attributeValue.substring(1));String resourceName = getResources().getResourceName(id);if("android:id/content".equals(resourceName)){GrayFrameLayout frameLayout = new GrayFrameLayout(this,attrs);return frameLayout;}}}}return super.onCreateView(parent, name, context, attrs);}
//硬件加速置灰方法public void setLayerGrayType(View view) {if (mGrayMatrix == null || mGrayPaint == null) {init();}view.setLayerType(View.LAYER_TYPE_HARDWARE, mGrayPaint);}
特殊控件需要置灰的话直接调用setLayerGrayType()方法将view传进去,比如demo中让某个Activity置灰,那就在Activity里面调用:
GrayManager.getInstance().setLayerGrayType(getWindow().getDecorView());