Android 实现图标和布局黑白化

1.抛出问题

这段时间业务让实现一个APP页面内黑白化的一个功能,以应对特殊情况下的特殊要求,我思考了一下,这个功能肯定是要做成配置化的,想要变成黑白化的时候,修改配置文件,就能立即生效,关闭也会相应的效率高一些,充分满足业务的需求。

2.话不多说,直接上代码

(1)在自己项目中封装的基类BaseActivity中,实现一下代码,为防止意外发生,最好是用try catch包一下,这个代码的作用是将自己封装的一个类在activity初始化时去加载出来,用来改变布局也可以说是view的一些特性来实现该功能。

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

(2)上面所用到的GrayFramelayout类代码如下,这个类做的工作就是重绘当前的页面,可以直接复制使用。开关的配置我在代码中没有实现,这个需要结合自己项目的实际情况进行配置,目前可以使用后台接口、或者远程的配置版本号文件(腾讯的cos,阿里的Oss等)能够实时读取到的。

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

}

3.总结

需求很简单,但是考虑的就需要很多,充分理解业务的需求点,涉及领域,做完的时候也要考虑兼容性,要进行兼容性测试,把风险降到最低。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdk2016

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值