Android App全局黑白效果实现方案

2020-04-04  本文已影响0人  momxmo

一、简述

2020年4月4日这天几乎大部分App和网站几乎都变成了黑白颜色,举国为疫情默哀,停止一切娱乐活动;
而作为一个技术人,有必要弄懂黑白效果的技术实现方案;
回想过去是实现方案有:
1.替换全部布局或者活肤(实现成本过高);
2.图片框架将所有图片资源全部黑白处理(只能实现图片资源的处理,局限性大)

最终想想,有没有能一劳永逸的方法呢?既能不对代码做过大的改动,又能兼容app的业务不受改动

答案是有的:
我们要从View布局开始入手,去研究window View的绘制过程,然后找到突破点。

二、利用Canvas实现黑白效果

使用ColorMartrix类中setSaturation调节饱和度,然后设置到画笔Paint中,使用画笔在Canvas画板实现黑白效果;
举个例子:

public class CustomImageView extends AppCompatImageView {
    private Paint mPaint = new Paint();

    public CustomImageView(Context context, AttributeSet attrs) {
        super(context, attrs);

        ColorMatrix cm = new ColorMatrix();
        cm.setSaturation(0);
        mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
        super.draw(canvas);
        canvas.restore();
    }

}

从这个例子可以知道,我们只需要通过自定义的View修改Canvas就能实现,通过这种方式我们可以全局的去修改整个App的效果;
具体怎么实现呢?
通常项目中我们都会自定义BaseActiviy继承AppCompatActivity重写onCreate, 获取window 的DecorView根对象设置画笔;
BaseActivity.java

public abstract class BaseActivity extends AppCompatActivity {
     @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);
        ...

}
}

这里只是举个例子,要实现的方式还有很多,只需要从页面的根布局入手;

上一篇 下一篇

猜你喜欢

热点阅读