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