Android 自定义View (三)

人的一生就像一篇文章,只有经过多次精心修改,才能不断完善。

本讲内容:ColorFilter 颜色过滤类(继上一讲进一步深入了解自定义View)

上一讲我们讲解了ColorMatrixColorFilter类

一、LightingColorFilter光照颜色过滤类(该类有且只有一个构造方法:)

LightingColorFilter (int mul, int add)  

mul全称是colorMultiply意为色彩倍增,add全称是colorAdd意为色彩添加,这两个值都是16进制的色彩值0xAARRGGBB

示例一:图片去掉绿色(会发现原来偏绿的部分成了红色,这涉及到色彩知识)

下面是自定义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;
	}

	// 初始化画笔
	private void initPaint() {
		// 实例化画笔并打开抗锯齿
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		//设置颜色过滤
		mPaint.setColorFilter(new LightingColorFilter(0xFFFF00FF, 0x00000000));
	}

	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 绘制位图 从资源获取一个Bitmap绘制在画布上
		canvas.drawBitmap(bitmap, x, y,mPaint);
	}

}

LightingColorFilter(0xFFFFFFFF,
0x00000000)的时候原图是不会有任何改变的,如果我们想增加红色的值,那么LightingColorFilter(0xFFFFFFFF, 0x00XX0000)就好,其中XX取值为00至FF。

示例二:一个灰色的矩形,我们点击后让它变成黄色

 
   

下面是自定义CustomTitleView.java文件:

public class CustomView extends View {
	private Paint mPaint;// 画笔
	private Context mContext;// 上下文环境引用
	private Bitmap bitmap;// 位图  

	private int x,y;// 位图绘制时左上角的起点坐标
	private boolean isClick;// 用来标识控件是否被点击过  

	public CustomView(Context context) {
		super(context, null);
	}

	public CustomView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.mContext = context;

		initPaint();// 初始化画笔
		initRes(context);//初始化资源

		setOnClickListener(new OnClickListener() {

			public void onClick(View arg0) {
				//判断控件是否被点击过
				if(isClick){
				//当我们不想要颜色过滤的效果时,setColorFilter(null)并重绘视图即可!
				// 如果已经被点击了则点击时设置颜色过滤为空还原本色
					mPaint.setColorFilter(null);
					isClick=false;
				}else{
				// 如果未被点击则点击时设置颜色过滤后为黄色
				mPaint.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0X00FFFF00))
					isClick=true;
				}

				// 记得重绘
                invalidate();
			}
		});
	}

	//初始化资源
	private void initRes(Context context) {
		// 获取位图
		bitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.g);

		 /*
         * 计算位图绘制时左上角的坐标使其位于屏幕中心
         * 屏幕坐标x轴向左偏移位图一半的宽度
         * 屏幕坐标y轴向上偏移位图一半的高度
         */
		x=MeasureUtil.getScreenSize((Activity)mContext)[0]/2-bitmap.getWidth()/2;
		y = MeasureUtil.getScreenSize((Activity) mContext)[1] / 2 - bitmap.getHeight() / 2;
	}

	// 初始化画笔
	private void initPaint() {
		// 实例化画笔并打开抗锯齿
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
	}

	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 绘制位图 从资源获取一个Bitmap绘制在画布上
		canvas.drawBitmap(bitmap, x, y,mPaint);
	}

}

二、PorterDuffColorFilter类(只有一个构造方法:)

PorterDuffColorFilter(int color, PorterDuff.Mode mode)  

一个是16进制表示的颜色值,而另一个是PorterDuff内部类Mode中的一个常量值,这个值表示混合模式(混合混合必定是有两种东西混才行)。第一种就是我们设置的color值而第二种是我们画布上的元素了!

示例三:把Color的值设为蓝色,而模式设为PorterDuff.Mode.DARKEN变暗:

变暗了也变蓝了(类似于PS中俩张图片,底面是蓝色图片,上面是我们的图片)…这就是PorterDuff.Mode.DARKEN模式的效果(也有其它的模式)PorterDuff.Mode中的模式不仅仅是应用于图像色彩混合,还应用于图形混合,比如PorterDuff.Mode.DST_OUT就表示裁剪混合图

下面是自定义CustomTitleView.java文件:

public class CustomView extends View {
	private Paint mPaint;// 画笔
	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;
	}

	// 初始化画笔
	private void initPaint() {
		// 实例化画笔并打开抗锯齿
		mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		// 设置颜色过滤
		mPaint.setColorFilter(new PorterDuffColorFilter(Color.BLUE, PorterDuff.Mode.DARKEN));
	}

	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 绘制位图 从资源获取一个Bitmap绘制在画布上
		canvas.drawBitmap(bitmap, x, y,mPaint);
	}

}

Take your time and enjoy it 路过的、学习过的请留个言,顶个呗~~

时间: 2024-10-09 23:18:55

Android 自定义View (三)的相关文章

Android 自定义View (三) 圆环交替 等待效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107 一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很适合的,就做了下,顺便和大家分享下,对于自定义View多练没坏处么.如果你看了前两篇,那么这篇一定so easy . 效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度. 还是我们自定View的那几个步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义

Android自定义View学习笔记04

Android自定义View学习笔记04 好长时间没有写相关的博客了,前几周在帮学姐做毕设,所以博客方面有些耽误.过程中写了一个类似wp的磁贴的view,想再写个配套的layout,所以昨天看了一下自定义viewGroup的相关知识-晚上睡觉想了一下可行性不是很高-代码量还不如直接自己在xml上写来得快,速度上也是个问题.今天看了一下张鸿洋老师的Android 自定义View (三) 圆环交替 等待效果这篇博文,再加上前一段时间看到的一幅图,结合之前写的一个圆形imageView的实现博文And

Android自定义View(三、深入解析控件测量onMeasure)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 onMeasure方法执行流程 MeasureSpec类 从ViewGroup的onMeasure到View的onMeasure ViewGroup中三个测量子控件的方法 getChildMeasureSpec方法 View的onMeasure setMeasuredDimension ??在上一篇

Android 自定义View使用示例(三)

转载 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu [email protected] 前言: 通过Android 自定义View和Android 自定义View使用示例(二),我们知道了如何使用自定义的View,以及Android绘制View的理论基础,其包含三个过程,测量View大小(通过onMeasure()方法实现),计算View位置(通过onLayout()方法实现),最后开始绘制(

Android 自定义 view(三)—— onDraw

前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自定义view的两个比较重要的方法 onDraw(Canvas canvas) ,在探究 onDraw方法之前,我们必须先深入了解两个类Paint和Canvas .   第一:认识Paint 在探究onDraw之前首先必须要认识两个类,这里给出非常不错的两个资料参考网站,我也是从这里得到想要知道的东西,简单的说

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

android 自定义View【2】对话框取色&amp;色盘取色的实现

android 自定义View[2]对话框取色&色盘取色的实现    上一篇文章基本介绍了android自定义view的流程:继承view,复写view的一些方法.实现简单的自定义view.这篇文章主要介绍的是系统对话框取色功能,然后顺便介绍升级版,色盘取色[类似于ps中的吸管,对图片点击相应位置,获取那个位置的颜色]. 一.概述:通过该例子了解以下内容: 1.进一步了解android 自定义view. 2.知道如何获取图片上的颜色值. 3.监听屏幕touch,实现移动的时候自动取色.[onDr

Android自定义View(CustomCalendar-定制日历控件)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/54020386 本文出自:[openXu的博客] 目录: 1分析 2自定义属性 3onMeasure 4onDraw 绘制月份 绘制星期 绘制日期及任务 5事件处理 源码下载 ??应项目需求,需要做一个日历控件,效果图如下: ???? ??接到需求后,没有立即查找是否有相关开源日历控件可用.系统日历控件是否能满足 ,第一反应就是这个控件该怎么画?谁叫咱自定义控件技术牛逼呢O(∩_∩)O哈哈~

我的Android进阶之旅------&gt;Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢daimajia的开源奉献! 第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/deta