Android黑白模式的实现

作者: waiwaaa | 来源:发表于2020-06-24 15:54 被阅读0次

    默哀日,基本上大多网页的黑白化,只要一句话就搞定了,思路就是加一个灰色的滤镜。公司app一个大红色也是够尬的,那我们Android端是不是也可以这样子干呢,我找度娘打听了一下,大神们已给出了方案,我也就不用去抠脑袋了。看看实现过程吧

    方法一

    onCreate中增加代码

            Paint paint = new Paint();
            ColorMatrix cm = new ColorMatrix();
            cm.setSaturation(0);
            paint.setColorFilter(new ColorMatrixColorFilter(cm));
            getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE, paint);
    

    方法来源马占柱

    方法二

    1.首先,写一个黑白模式的FrameLayout布局

    public class GrayFrameLayout extends FrameLayout {
        private Paint mPaint = new Paint();
    
        public GrayFrameLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            ColorMatrix cm = new ColorMatrix();
            cm.setSaturation(0);
            mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
        }
    
        @Override
        protected void dispatchDraw(Canvas canvas) {
            canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
            super.dispatchDraw(canvas);
            canvas.restore();
        }
    
    
        @Override
        public void draw(Canvas canvas) {
            canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
            super.draw(canvas);
            canvas.restore();
        }
    
    }
    
    

    2.在你的BaseActivity中加上,替换android.id.content 对应的 FrameLayout

    @Override
    public View onCreateView(String name, Context context, AttributeSet attrs) {
        try {
            if ("FrameLayout".equals(name)) {
                int count = attrs.getAttributeCount();
                for (int i = 0; i < count; i++) {
                    String attributeName = attrs.getAttributeName(i);
                    String attributeValue = attrs.getAttributeValue(i);
                    if (attributeName.equals("id")) {
                        int id = Integer.parseInt(attributeValue.substring(1));
                        String idVal = getResources().getResourceName(id);
                        if ("android:id/content".equals(idVal)) {
                            GrayFrameLayout grayFrameLayout = new GrayFrameLayout(context, attrs);
                            return grayFrameLayout;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.onCreateView(name, context, attrs);
    }
    
    

    3. 如果用了WebView,请加上webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);这句,不然位置会异常。

    此方法更多细节请移步鸿洋的App 黑白化实现探索,有一行代码实现的方案吗?

    相关文章

      网友评论

        本文标题:Android黑白模式的实现

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