Android 自定义View (二)

本文详细介绍了Android中自定义View使用ColorFilter进行颜色处理的方法。通过ColorMatrixColorFilter改变视图的颜色效果,提供了多种色彩矩阵配置示例,如反相、老旧照片风格及高对比度效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果你能像看别人缺点一样,如此准确的发现自己的缺点,那么你的生命将会不平凡。


本讲内容: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 路过的、学习过的请留个言,顶个呗~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值