PathDashPathEffect 和 DashPathEffect 的区别:
DashPathEffect 是用来画虚线的,而PathDashPathEffect 是特殊的DashPathEffect, 特殊的地方是,虚线不是用线画,而是用Path(形状)来画。
所以,PathDashPathEffect 也是可以用来画虚线的,只不过会比DashPathEffect 麻烦。
而且这里有一个地方需要注意一下,这里的Path 必须是有高度的,Path 不能是点,线,只能是圆,矩形等。不然是画不出来东西的。
使用PathDashPathEffect 画虚线:
public class PathDashPathEffectViewTest extends View {
private Paint paint;
private Path path;
private PathEffect pathEffect;
private int startY;
private Path pathAll;
public PathDashPathEffectViewTest(Context context) {
super(context);
init(context);
}
public PathDashPathEffectViewTest(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public PathDashPathEffectViewTest(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setTextSize(40);
path = new Path();
path.lineTo(5,0);
path.rLineTo(0,2);
path.rLineTo(-5,0);
startY = 120;
pathAll = new Path();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//path 为形状
pathEffect = new PathDashPathEffect(path,10f,0f, PathDashPathEffect.Style.TRANSLATE);
paint.setPathEffect(pathEffect);
pathAll.moveTo(0,startY);
pathAll.lineTo(getWidth(),startY);
//pathALL 是整个要使用形状画的路径
canvas.drawPath(pathAll,paint);
}
}
使用PathDashPathEffect 沿着指定路径 绘制圆 和 梯形
public class PathDashView extends View {
private Paint mPaint;
private Path mPath1;
private Path mPath2;
private Path mPath;
private Paint mPaint1;
private Paint mPaint2;
private Path pPath;
private Path pPath2;
private PathEffect mPathEffect;
private PathEffect mPathEffect1;
private PathEffect mPathEffect2;
public PathDashView(Context context) {
this(context,null);
}
public PathDashView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public PathDashView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(5);
mPaint.setColor(Color.RED);
mPaint1 = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint1.setStyle(Paint.Style.STROKE);
mPaint1.setStrokeWidth(5);
mPaint1.setColor(Color.RED);
mPaint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint2.setStyle(Paint.Style.STROKE);
mPaint2.setStrokeWidth(5);
mPaint2.setColor(Color.RED);
mPath = new Path();
mPath.moveTo(0,300);
mPath.lineTo(200,300);
mPath.lineTo(400,100);
mPath.lineTo(600,400);
mPath1 = new Path();
mPath1.moveTo(0,350);
mPath1.lineTo(200,350);
mPath1.lineTo(400,150);
mPath1.lineTo(600,450);
mPath2 = new Path();
mPath2.moveTo(0,400);
mPath2.lineTo(200,400);
mPath2.lineTo(400,200);
mPath2.lineTo(600,500);
//第一种间隔,小圆点
pPath = new Path();
pPath.addCircle(0,0,5,Path.Direction.CW);
//第二种间隔,小梯形
pPath2 = new Path();
pPath2.lineTo(0,5);
pPath2.rLineTo(10,0);
pPath2.rLineTo(-5,-5);
mPathEffect = new PathDashPathEffect(pPath,40,0,PathDashPathEffect.Style.ROTATE);
mPathEffect1 = new PathDashPathEffect(pPath,20,0,PathDashPathEffect.Style.TRANSLATE);
mPathEffect2 = new PathDashPathEffect(pPath2,20,6,PathDashPathEffect.Style.ROTATE);
mPaint.setPathEffect(mPathEffect);
mPaint1.setPathEffect(mPathEffect1);
mPaint2.setPathEffect(mPathEffect2);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(mPath,mPaint);
canvas.drawPath(mPath1,mPaint1);
canvas.drawPath(mPath2,mPaint2);
}
}
PathDashPathEffect 构造参数:
public PathDashPathEffect(Path shape, float advance, float phase,
Style style) {
native_instance = nativeCreate(shape.readOnlyNI(), advance, phase,
style.native_style);
}
- shape 是用于绘制的形状。
- advance 是两个形状间隔的距离 phase 是绘制第一个形状的时候,向左偏移的距离
- Style 绘制的样式。 有三个值,ROTATE 是随着路径的旋转而旋转,TRANSLATE 平移不会随着路径的旋转而旋转,MORPH
和ROTATE基本一样,会随着路径的旋转而旋转,但是在拐点的地方,会增加平滑度。
我们从实例看下Style 的不同区别
Style 为ROTATE
Style 为TRANSLATE
Style 为MORPH
使用PathDashPathEffect 绘制刻度
代码:
public class ClockViewTest extends View {
private Paint paint;
private Path path;
private PathEffect pathEffect;
private int startY;
private Path pathAll;
//刻度宽度的一半
public static final int W = 5;
//刻度的高度
public static final int H = 20;
//一圈有多少个刻度
public static final int Count = 12;
private float length;
public ClockViewTest(Context context) {
super(context);
init(context);
}
public ClockViewTest(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context);
}
public ClockViewTest(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(1);
paint.setTextSize(40);
path = new Path();
path.addRect(new RectF(-W,0,W,H), Path.Direction.CW);
startY = 120;
pathAll = new Path();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
pathAll.addCircle(w/2,h/2,200, Path.Direction.CW);
PathMeasure pathMeasure = new PathMeasure(pathAll,true);
length = pathMeasure.getLength();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//path 为形状
pathEffect = new PathDashPathEffect(path,length / Count,0f, PathDashPathEffect.Style.ROTATE);
paint.setPathEffect(pathEffect);
//pathALL 是整个要使用形状画的路径
canvas.drawPath(pathAll,paint);
}
}
参考:
https://blog.csdn.net/chenguang79/article/details/102543248