使用 PathEffect 来给图形的轮廓设置效果。对 Canvas 所有的图形绘制有效,也就是 drawLine() drawCircle() drawPath() 这些方法。大概像这样:
下面就具体说一下 Android 中的 6 种 PathEffect
。PathEffect
分为两类,单一效果的 CornerPathEffect
DiscretePathEffect
DashPathEffect
PathDashPathEffect
,和组合效果的 SumPathEffect
ComposePathEffect
。
1.1 CornerPathEffect
把所有拐角变成圆角。
PathEffect pathEffect = new CornerPathEffect(20);
paint.setPathEffect(pathEffect);...
canvas.drawPath(path, paint);
它的构造方法 CornerPathEffect(float radius)
的参数 radius
是圆角的半径。
1.2 DiscretePathEffect
把线条进行随机的偏离。偏离的方式和程度由参数决定。
PathEffect pathEffect = new DiscretePathEffect(22, 5);
paint.setPathEffect(pathEffect);...
canvas.drawPath(path, paint);
DiscretePathEffect
具体的做法是,把绘制改为使用定长的线段来拼接,并且在拼接的时候对路径进行随机偏离。它的构造方法 DiscretePathEffect(float segmentLength, float deviation)
的两个参数中, segmentLength
是用来拼接的每个线段的长度, deviation
是偏离量。这两个值设置得不一样,显示效果也跟着不一样。
1.3 DashPathEffect
使用虚线来绘制线条。
PathEffect pathEffect = new DashPathEffect(new float[]{20, 10, 5, 10}, 0);
paint.setPathEffect(pathEffect);...
canvas.drawPath(path, paint);
这个函数的构造方法 DashPathEffect(float[] intervals, float phase)
中, 第一个参数 intervals
是一个数组,它指定了虚线的格式:数组中元素必须为偶数(最少是 2 个),按照「画线长度、空白长度、画线长度、空白长度」……的顺序排列,例如上面代码中的 20,10,5,10
就表示虚线是按照「画 20 像素、空 10 像素、画 5 像素、空 10 像素」的模式来绘制;第二个参数 phase
是虚线的偏移量。
1.4 PathDashPathEffect
这个方法比 DashPathEffect
多一个前缀 Path
,所以顾名思义,它是使用一个 Path
来绘制“虚线”。
Path dashPath = ...; // 使用一个三角形来做 dash
PathEffect pathEffect = new PathDashPathEffect(dashPath, 40, 0,
PathDashPathEffectStyle.TRANSLATE);
paint.setPathEffect(pathEffect);...
canvas.drawPath(path, paint);
它的构造方法 PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style)
中, shape
参数是用来绘制的 Path
; advance
是两个相邻的 shape
段之间的间隔,不过注意,这个间隔是两个 shape
段的起点的间隔,而不是前一个的终点和后一个的起点的距离; phase
和 DashPathEffect
中一样,是虚线的偏移;最后一个参数 style
,是用来指定拐弯改变的时候 shape
的转换方式。style
的类型为 PathDashPathEffect.Style
,是一个 enum
,具体有三个值:
TRANSLATE
:位移ROTATE
:旋转MORPH
:变体
1.5 ComposePathEffect
这也是一个组合效果类的 PathEffect
。不过它是先对目标 Path
使用一个 PathEffect
,然后再对这个改变后的 Path
使用另一个 PathEffect
。
PathEffect dashEffect = new DashPathEffect(new float[]{20, 10}, 0);
PathEffect discreteEffect = new DiscretePathEffect(20, 5);
pathEffect = new ComposePathEffect(dashEffect, discreteEffect);...
canvas.drawPath(path, paint);
它的构造方法 ComposePathEffect(PathEffect outerpe, PathEffect innerpe)
中的两个 PathEffect
参数, innerpe
是先应用的, outerpe
是后应用的。所以上面的代码就是“先偏离,再变虚线”。而如果把两个参数调换,就成了“先变虚线,再偏离”。
上面这些就是 Paint
中的 6 种 PathEffect
。它们有的是有独立效果的,有的是用来组合不同的 PathEffect
的,功能各不一样。
提醒一下:
PathEffect
在有些情况下不支持硬件加速,需要关闭硬件加速才能正常使用:
Canvas.drawLine()
和Canvas.drawLines()
方法画直线时,setPathEffect()
是不支持硬件加速的;PathDashPathEffect
对硬件加速的支持也有问题,所以当使用PathDashPathEffect
的时候,最好也把硬件加速关了。
今天就写到这里啦,希望大家都能越来越棒!