APP全局色彩饱和度修改
对以下两篇鸿洋大神的博文进行了实践,并记录对应的问题。
App 黑白化实现探索,有一行代码实现的方案吗?
App 黑白化实现探索2, 发现了一种更方便的方案,我被锤了!
第一篇
第一篇采用是比较常规的方法,即在View绘制的时候改变色彩饱和度,以ImageView为例,代码如下:
public class MyTextView extends ImageView {Paint mPaint = new Paint();public MyImageView(Context context) {super(context);init();}public MyImageView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init(){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);canvas.restore();}}
如果是ViewGroup类型的需要在dispatchDraw中也做处理。
第二篇
第二篇的方案比较取巧,而且不熟悉源码的话大概没那么容易想到。view.setLayerType(layerType, null);View的硬件加速方法第二个参数可以设置Paint,对Paint设置相应的属性即可达到效果,代码如下:
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
view.setLayerType(View.LAYER_TYPE_HARDWARE, paint);
问题
1、第一种方法原文中提到对WebView、视频播放会有影响。
2、第一种方法我自己实践过程中发现View设置了Background会导致Background的饱和度不变,可能是我哪里需要再处理一下。
3、第二种方式我自己再实践过程中发现对视频拍摄有影响,会不断地闪。