Graphics>PathEffects
这个例子的主要讲解path的绘制修饰。
当你绘制path的时候需要的参数如下:一个path对象,和一个画笔
canvas.drawPath(mPath, mPaint);
要怎样修饰这个path呢,答案就在这个画笔当中,要给画笔设置PathEffect对象。 mPaint.setPathEffect(mEffects[i]);
在例子中 创建了一个数组去保存各个patheffect对象
private static void makeEffects(PathEffect[] e, float phase) {
e[0] = null; // no effect
e[1] = new CornerPathEffect(10);//打磨棱角 输入半径
e[2] = new DashPathEffect(new float[] {10, 5, 5, 5}, phase);//虚线
//可以自定义虚线的样式
e[3] = new PathDashPathEffect(makePathDash(), 12, phase,
PathDashPathEffect.Style.ROTATE);
e[4] = new ComposePathEffect(e[2], e[1]);//组合上面两个的特点
e[5] = new ComposePathEffect(e[3], e[1]);
}
e[0] 不含任何PathEffect,缺省绘制Path的风格,单色实线,连接处为尖角。e[1] 连接使用圆弧连接。
e[2] 使用缺省的虚线绘制路径。只对Paint设为STROKE 或STROKE_AND_FILL时有效。
e[3] 使用自定义的图形(本例为一箭头)的虚线绘制路径只对Paint设为STROKE 或STROKE_AND_FILL时有效。
e[4] 为使用e[2]和e[1]综合效果,虚线并圆弧连接。
e[5] 为使用e[3]和e[1]综合效果,自定义虚线并圆弧连接。
绘制代码如下:
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
RectF bounds = new RectF();
mPath.computeBounds(bounds, false);//计算path的区域,并将结果输出给bounds
canvas.translate(10 - bounds.left, 10 - bounds.top);
makeEffects(mEffects, mPhase);
mPhase += 1;
invalidate();
for (int i = 0; i < mEffects.length; i++) {
mPaint.setPathEffect(mEffects[i]);
mPaint.setColor(mColors[i]);
canvas.drawPath(mPath, mPaint);
canvas.translate(0, 28);
}
}
mPhase 指定的是虚线上虚实偏移,每次加1,相当于交换虚处和实处的位置,而invalidate()将再次出发onDraw ,这样虚实不断变换给人以动画的效果。