在使用了Panit画笔之后,可以对其进行渲染,从而达到更加人性化的方式
渲染分类
按常用渲染方式可以分为以下几种:
BimapShader
位图的图像渲染器LinearGradient
线性渲染RadialGradient
环形渲染:水波纹效果,充电水波纹扩散效果、调色板SweepGradient
梯度渲染(扫描渲染):微信等雷达扫描效果,手机卫士垃圾扫描ComposeShader
组合渲染
BimapShader
首先来研究下BimapShader是怎么使用的
一般来说绘制位图使用这种方式
1 | canvas.drawBitmap(bitmap, 0, 0, paint); |
这样就直接将位图绘制在界面上,那么使用以后,可以设置三种系统模式,设置完以后画笔添加Shader,然后就可以使用位图渲染器了
这样的设置运用于图片宽高小于给定的宽高的处理方式
1 | //CLAMP 拉伸最后一个像素填满 |
其常用的场景其中一个就是绘制用户圆形头像,其中width为bitmap的宽
1 | canvas.drawCircle(width / 2, width / 2, width / 2, paint); |
这样的设置会以图片的中心点切出一个圆,那么如果图片方形,切出的图片效果还可以,那么如果为矩形,要么设置时候切为方形,要么继续处理,其思路就是对短边进行拉伸,但一般不建议那么做,那样做图片就变形了,其拉伸代码如下
1 | float scale = (float) Math.max(width, height) / Math.min(width, height); |
当然也可以绘制椭圆
1 | canvas.drawOval(new RectF(0, 0, width, height), paint); |
另外通过shapeDrawable也可以实现
1 | ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape()); |
LinearGradient
线性渲染,其实就是一种线性渐变,可以实现各种炫酷的过度效果
LinearGradient的参数:x0, y0
:起始点x1, y1
:结束点int[] colors
:中间依次要出现的几个颜色float[] positions
:数组大小跟colors数组一样大,中间依次摆放的几个颜色分别放置在那个位置上(参考比例从左往右)TileMode tile
:CLAMP,MIRROR和REPEAT
1 | LinearGradient linearGradient = new LinearGradient(0, 0, 500, 0, colors, null, Shader.TileMode.CLAMP); |
其效果就是画出一条渐变色的彩带,和调色板类似
RadialGradient
环形渲染可以做出很多炫酷的效果,水波纹,充电波动等等,都是环形渲染做出来的
1 | RadialGradient radialGradient = new RadialGradient(100, 100, 50, colors, null, Shader.TileMode.CLAMP); |
SweepGradient
类似于色度盘
1 | SweepGradient sweepGradient = new SweepGradient(100, 100, colors, null); |
ComposeShader
组合多个渲染方式,其参数为多个
1 | ComposeShader composeShader = new ComposeShader(radialGradient, sweepGradient, PorterDuff.Mode.SRC_OVER); |
参数示例图如下
具体代码参阅Android示例源代码Xfermodes.java
参数意义为:
PorterDuff.Mode.CLEAR
所绘制不会提交到画布上PorterDuff.Mode.SRC
显示上层绘制图片PorterDuff.Mode.DST
显示下层绘制图片PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分PorterDuff.Mode.DST_OUT
取下层绘制非交集部分PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分PorterDuff.Mode.XOR
异或:去除两图层交集部分PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色
图像示例
1 | //线性渲染 |
例子:歌词的显示效果
自定义一个TextView,然后在绘制时候通过矩阵变换,不断设置线性渐变的位置,从而达到效果
1 | public class LinearGradientTextView extends TextView { |
布局
1 |
|
例子:放大镜
这里自定义一个View,用来承载图片以及局部放大
1 | public class ZoomImageView extends View { |
调用的时候直接设置这个View
1 | public class ZoomImageActivity extends AppCompatActivity { |