如果你能像看别人缺点一样,如此准确的发现自己的缺点,那么你的生命将会不平凡。
本讲内容: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 路过的、学习过的请留个言,顶个呗~~