当前位置: 代码迷 >> Android >> Android 自定义View (2)
  详细解决方案

Android 自定义View (2)

热度:34   发布时间:2016-04-28 01:59:46.0
Android 自定义View (二)

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


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

  相关解决方案