一、简述
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);
...
}
}
这里只是举个例子,要实现的方式还有很多,只需要从页面的根布局入手;