Android 自定义View (三)
来源:互联网 发布:自动化办公软件下载 编辑:程序博客网 时间:2024/05/29 18:48
人的一生就像一篇文章,只有经过多次精心修改,才能不断完善。
本讲内容: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 路过的、学习过的请留个言,顶个呗~~
1 0
- Android 自定义View (三)
- Android 自定义View (三)
- Android自定义View(三)
- Android 自定义View (三) ProgressBar
- android 自定义view(三)
- 自定义View(三)(Android群英传)
- android 自定义View 三 ---- LayoutInflater
- android自定义view(三)
- Android自定义View教程(三)
- [Android 知识点] 自定义View(三)
- Android 自定义View(三)
- Android进阶三:自定义View
- Android自定义view三圆环
- Android自定义View(三)继承View
- Android自定义View解析之自定义View类型(三)
- Android -自定义view(三)自定义view的流程
- Android自定义View专题三-自定义View属性
- Android学习之自定义view(三)
- oracle中修改表名的几种方式
- 前台后台中文乱码问题
- linux下用vi,vim编辑时退出编辑模式(wq)无法保存退出
- java实现一个抽奖概率类
- 泛型Demo
- Android 自定义View (三)
- android eclipse opencv环境配置
- localStorage、sessionStorage用法总结
- 【2015-03-17 11:27 星期三 ListView的常见属性分析】
- C/C++ 数据范围int
- word用尾注插入参考文献—删除横线,空格等
- 实现一个通讯录
- [LeetCode] Linked List Cycle
- hadoop groupingComparator 与 secondary sort