如果你能像看别人缺点一样,如此准确的发现自己的缺点,那么你的生命将会不平凡。
本讲内容:ColorFilter 颜色过滤类(继上一讲进一步深入了解自定义View)
一、画笔Paint常用的一些属性:
1、set(Paint src) 为当前画笔设置一个画笔
2、setARGB(int a, int r, int g, int b)和setAlpha(int a) 设置透明度和颜色
3、setAntiAlias(boolean aa)打开抗锯齿,注意:抗锯齿是依赖于算法的,算法决定抗锯齿的效率,在我们绘制棱角分明的图像时,比如一个矩形、一张位图,我们不需要打开抗锯齿。
4、setColorFilter(ColorFilter filter) 设置颜色过滤
ColorFilter类的三个子类分别是ColorMatrixColorFilter、LightingColorFilter和PorterDuffColorFilter,也就是说我们在setColorFilter(ColorFilter filter)的时候可以直接传入这三个子类对象作为参数
a、ColorMatrixColorFilter 色彩矩阵颜色过滤器
先了解什么是色彩矩阵。在Android中图片是以RGBA像素点的形式加载到内存中的,修改这些像素信息需要一个叫做ColorMatrix类的支持,其定义了一个4x5的float[]类型的矩阵:
ColorMatrix colorMatrix = new ColorMatrix(new float[]{ 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, });第一行表示的R(红色)的向量,第二行表示的G(绿色)的向量,第三行表示的B(蓝色)的向量,最后一行表示A(透明度)的向量,这一顺序必须要正确不能混淆!这个矩阵不同的位置表示的RGBA值,其范围在0.0F至2.0F之间,1为保持原图的RGB值。每一行的第五列数字表示偏移值
示例一:绘制一个圆(注意setColorFilter(ColorFilter filter) 的用法)
图二设置了颜色过滤(颜色变深了便淳厚了!)
你会想改个颜色还这么复杂!不是可以直接setColor!没错,你这样想是对的,因为毕竟我们只是一个颜色,可是如果是一张图片呢?一张图片可有还几十万色彩呢!
下面是自定义CustomTitleView.java文件:
public class CustomView extends View { private Paint mPaint;// 画笔 // 上下文环境引用 就是一个装满信息的信使,Android需要它从里面获取需要的信息。 private Context mContext; public CustomView(Context context) { super(context, null); } // 默认的布局文件调用的是两个参数的构造方法 public CustomView(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; initPaint();// 初始化画笔 } // 生成色彩矩阵 ColorMatrix colorMatrix=new ColorMatrix(new float[]{ 0.5F,0,0,0,0, 0,0.5F,0,0,0, 0,0,0.5F,0,0, 0,0,0,1,0, }); // 初始化画笔 private void initPaint() { // 实例化画笔并打开抗锯齿 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); // 设置画笔样式填充 mPaint.setStyle(Paint.Style.FILL); // 设置画笔颜色为自定义颜色 mPaint.setColor(Color.argb(255, 255, 128, 105)); // 设置描边的粗细 mPaint.setStrokeWidth(10); //设置颜色过滤 mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制圆形 canvas.drawCircle( MeasureUtil.getScreenSize((Activity) mContext)[0] / 2, MeasureUtil.getScreenSize((Activity) mContext)[1] / 2, 200, mPaint); }}
示例二: 绘制位图 从资源获取一个Bitmap绘制在画布上
图二设置了颜色过滤(颜色暗!)
下面是自定义CustomTitleView.java文件:
public class CustomView extends View { private Paint mPaint;// 画笔 // 上下文环境引用 就是一个装满信息的信使,Android需要它从里面获取需要的信息。 private Context mContext; private Bitmap bitmap;// 位图 private int x,y;// 位图绘制时左上角的起点坐标 public CustomView(Context context) { super(context, null); } // 默认的布局文件调用的是两个参数的构造方法 public CustomView(Context context, AttributeSet attrs) { super(context, attrs); this.mContext = context; initPaint();// 初始化画笔 initRes(context);//初始化资源 } //初始化资源 private void initRes(Context context) { // 获取位图 bitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.p); /* * 计算位图绘制时左上角的坐标使其位于屏幕中心 * 屏幕坐标x轴向左偏移位图一半的宽度 * 屏幕坐标y轴向上偏移位图一半的高度 */ x=MeasureUtil.getScreenSize((Activity)mContext)[0]/2-bitmap.getWidth()/2; y = MeasureUtil.getScreenSize((Activity) mContext)[1] / 2 - bitmap.getHeight() / 2; } // 生成色彩矩阵 ColorMatrix colorMatrix=new ColorMatrix(new float[]{ 0.5F,0,0,0,0, 0,0.5F,0,0,0, 0,0,0.5F,0,0, 0,0,0,1,0, }); // 初始化画笔 private void initPaint() { // 实例化画笔并打开抗锯齿 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); //设置颜色过滤 mPaint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制位图 从资源获取一个Bitmap绘制在画布上 canvas.drawBitmap(bitmap, x, y,mPaint); }}
改下ColorMatrix矩阵:类似PS里反相的效果
ColorMatrix colorMatrix=new ColorMatrix(new float[]{ -1,0,0,1,1, 0,-1,0,1,1, 0,0,-1,1,1, 0,0,0,1,0, });
改下ColorMatrix矩阵:类似于老旧照片
ColorMatrix colorMatrix=new ColorMatrix(new float[]{ 0.393F, 0.769F, 0.189F, 0, 0, 0.349F, 0.686F, 0.168F, 0, 0, 0.272F, 0.534F, 0.131F, 0, 0, 0, 0, 0, 1, 0, });
改下ColorMatrix矩阵:类似去色后高对比度的效果
ColorMatrix colorMatrix=new ColorMatrix(new float[]{ 1.5F, 1.5F, 1.5F, 0, -1, 1.5F, 1.5F, 1.5F, 0, -1, 1.5F, 1.5F, 1.5F, 0, -1, 0, 0, 0, 1, 0, });
依次效果图:
Take your time and enjoy it 路过的、学习过的请留个言,顶个呗~~