介绍三种方案全局设置灰白模式,原理都是相同的,利用Android提供的ColorMatrix(颜色矩阵),将其饱和度设置为0,这样使用Paint绘制出来的都是没有饱和度的灰白样式!
不同的方案只是设置时机不同而已。
Android APP全局黑白化实现方案_xiaoerbuyu1233的博客-CSDN博客
Application里面不是有registerActivityLifecycleCallbacks这个注册监听方法吗?监听里面的onActivityCreated不是可以获取到当前的Activity吗?那DecorView不就拿到了!
- public class StudyApp extends Application {
-
- @Override
- public void onCreate() {
- super.onCreate();
-
- Paint mPaint = new Paint();
- ColorMatrix mColorMatrix = new ColorMatrix();
- mColorMatrix.setSaturation(0);
- mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
-
- registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
-
- @Override
- public 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设置灰度
- @Override
- protected 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));
- }
-
- @Override
- protected void onDraw(Canvas canvas) {
- canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
- super.onDraw(canvas);
- }
-
- @Override
- protected void dispatchDraw(Canvas canvas) {
- canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
- super.dispatchDraw(canvas);
- }
- }
在BaseActivity的onCreateView方法中做如下处理:
- @Override
- public 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());