Android UI效果之绘图篇(三)

所属分类: 软件编程 / Android 阅读数: 1123
收藏 0 赞 0 分享

一、 PorterDuffXfermode

PorterDuffXfermode类似于数据集合里面的交集并集概念,只是数据里面取的是两个集合,而我们这里取的是两个图形之间的交集并集,我们先来看一张Android API Demo里面一张金典的图

图中的Src和Dst相当于是数学中的两个集合,而在我们的代码中我们可以这样来操作这两个集合

canvas.drawSrc();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XXX));
canvas.drawDst();

只需要更具我们的需要设置不同的Mode即可,从此以后,圆角矩形什么的,那都不是事儿!

二、Shader

Shader字面意思是着色器、渲染器,有五个子类分别是:

  • BitmapShader
  • LinearGradient
  • RadialGradient
  • SweepGradient
  • ComposeShader

1、BitmapShader:位图渲染,顾名思义,使用BitmapShader可以对位图进行一些着色渲染操作
构造方法如下

 /**
 * @param bitmap 需要渲染的位图
 * @param tileX X方向渲染模式
 * @param tileY Y方向渲染模式.
 */
 public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY)

第一个参数不用多说,第二个和第三个渲染模式TileMode有三个可选项
①. CLAMP:当bitmap比要绘制的图形小时拉伸位图的最后一个像素;当bitmap比要绘制的图形大时,根据绘制图形剪裁bitmap

 BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
 paint.setShader(bitmapShader);
 canvas.drawRect(0, 0, bitmap.getWidth() * 2, bitmap.getHeight() * 2, paint);

 BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
 paint.setShader(bitmapShader);
 RectF rect = new RectF(100, 100, 300, 300);
 canvas.drawRoundRect(rect, 30, 30,paint);

②. REPEAT :当bitmap比要绘制的图形小时横向纵向不断重复bitmap;当bitmap比要绘制的图形大时,根据绘制图形剪裁bitmap

BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
paint.setShader(bitmapShader);
canvas.drawRect(0, 0, bitmap.getWidth() *2, bitmap.getHeight() * 2, paint);

③. MIRROR :和REPEAT 类似,当bitmap比要绘制的图形小时横向纵向不断重复bitmap,不同的是相邻的两个bitmap互为镜像

BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
paint.setShader(bitmapShader);
canvas.drawRect(0, 0, bitmap.getWidth() * 4, bitmap.getHeight() * 4, paint);

熟悉BitmapShader之后,圆角图片、圆形头像什么的就更easy了

1.LinearGradient 线性渐变
先来看下它的构造方法

 /**
 * 创建一个LinearGradient
 @param x0 起始X坐标
 @param y0 起始Y坐标
 @param x1 结束X坐标
 @param y1 结束Y坐标
 @param color0 起始颜色值
 @param color1 结束颜色值
 @param tile shader的mode
 */
 public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1,TileMode tile)

LinearGradient(float x0, float y0, float x1, float y1, int[] colors, float[] positions, Shader.TileMode tile)

两个构造方法类似,第二个只是可以添加更多颜色,把颜色值封装到了数组colors中,其后的positions是与之colors对于的颜色的比例,如果为null,颜色值则平均分布。
LinearGradient和BitmapShader一样有三个TileMode可选CLAMP、REPEAT、MIRROR。实现的效果如下:
① CLAMP

LinearGradient lg = new LinearGradient(0, 0, 300, 300, 0xFFFF0000, 0xFF0000FF, Shader.TileMode.CLAMP);
paint.setShader(lg);
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);

② REPEAT

LinearGradient lg = new LinearGradient(0, 0, 300, 300, 0xFFFF0000, 0xFF0000FF, Shader.TileMode.REPEAT);
paint.setShader(lg);
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);

③ MIRROR

LinearGradient lg = new LinearGradient(0, 0, 300, 300, 0xFFFF0000, 0xFF0000FF, Shader.TileMode.MIRROR);
paint.setShader(lg);
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);



还有三个shader没有介绍,感觉篇幅有点长了,留到下一篇再给大家讲解,希望大家继续关注。

更多精彩内容其他人还在看

Android网络编程之获取网络上的Json数据实例

这篇文章主要介绍了Android网络编程之获取网络上的Json数据实例,本文用完整的代码实例讲解了在Android中读取网络中Json数据的方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中的windowSoftInputMode属性详解

这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下
收藏 0 赞 0 分享

Android网络编程之UDP通信模型实例

这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中使用ListView实现漂亮的表格效果

这篇文章主要介绍了Android中使用ListView实现漂亮的表格效果,本文用详细的代码实例创建了一个股票行情表格,需要的朋友可以参考下
收藏 0 赞 0 分享

Android中刷新界面的二种方法

这篇文章主要介绍了Android中刷新界面的二种方法,本文使用Handler、postInvalidate两种方法实现界面刷新,需要的朋友可以参考下
收藏 0 赞 0 分享

Android SDK三种更新失败及其解决方法

这篇文章主要介绍了Android SDK三种更新失败及其解决方法,需要的朋友可以参考下
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(一)

Android3.0(API level 11)开始,Android设备不再需要专门的菜单键。随着这种变化,Android app应该取消对传统6项菜单的依赖。取而代之的是提供anction bar来提供基本的用户功能
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(二)

这次将继续上一篇文章没有讲完的Menu的学习,上下文菜单(Context menu)和弹出菜单(Popup menu)
收藏 0 赞 0 分享

Android学习笔记——Menu介绍(三)

今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习,需要的朋友可以参考下
收藏 0 赞 0 分享

Android显示网络图片实例

这篇文章主要介绍了Android显示网络图片的方法,以实例形式展示了Android程序显示网络图片的方法,非常具有实用价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多