美文网首页
Android App全局黑白效果实现方案

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

作者: momxmo | 来源:发表于2020-04-04 23:46 被阅读0次

    一、简述

    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);
            ...
    
    }
    }
    

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

    相关文章

      网友评论

          本文标题:Android App全局黑白效果实现方案

          本文链接:https://www.haomeiwen.com/subject/zhdephtx.html