背景
前段时间常用的app 都添加上了灰色的颜色,突发奇想
功能
通过重新去绘制view,修改Canvas的饱和度
相关实现类
frameworks/base/graphics/java/android/graphics/ColorMatrix.java
如何改变
一行代码实现:
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
上菜
代码块
public class GrayColorLinearLayout extends LinearLayout {
private final String TAG = "GrayLinearLayout";
private Paint mPaint = new Paint();
public GrayColorLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
Log.d(TAG, "GrayLinearLayout: ");
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);
mPaint.setColorFilter(new ColorMatrixColorFilter(cm));
}
@Override
public void draw(Canvas canvas) {
Log.d(TAG, "draw: ");
canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
super.draw(canvas);
canvas.restore();
}
@Override
protected void dispatchDraw(Canvas canvas) {
Log.d(TAG, "dispatchDraw: ");
canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
super.dispatchDraw(canvas);
canvas.restore();
}
}
注意点
为什么要重写dispatchDraw()?
答:Canvas对象是往下传递的,因此我们为了降低成本 ,可以针对androids常用的几大布局进行修改,不必针对某个view修改
绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现;绘制自己的子组件通过dispatchDraw(canvas)实现。
使用 saveLayer() 方法保存默认的状态,使用 restore()进行恢复