安卓开发之使用DashPathEffect来绘制虚线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cxmscb/article/details/51760528

原理:

主要用到了PathEffect的子类 DashPathEffect

方法:

给画笔Paint对象设置绘制路径时的特效:.setPathEffect

效果:

DashPathEffect 构造方法的参数决定了绘制的路径效果:

public DashPathEffect(
    float[] intervals,
    float phase )
intervals是一个float数组,且其长度必须是偶数且>=2,指定了多少长度的实线之后再画多少长度的空白。例如

    new DashPathEffect(new float[] { 8, 10, 8, 10}, 0);  
    指定了绘制8px的实线,再绘制10px的透明,再绘制8px的实线,再绘制10px的透明,
    依次重复来绘制达到path对象的长度。

phase参数指定了绘制的虚线相对了起始地址(Path起点)的取余偏移(对路径总长度)。

    new DashPathEffect(new float[] { 8, 10, 8, 10}, 0); 
    这时偏移为0,先绘制实线,再绘制透明。

    new DashPathEffect(new float[] { 8, 10, 8, 10}, 8); 
    这时偏移为8,先绘制了透明,再绘制了实线.(实线被偏移过去了)

    可是通过不断地递增/递减来改变phase的值,达到一个路径自身不断循环移动的动画效果。

注意:

    phase is an offset into the intervalsarray (mod the sum of all of the intervals). The intervals arraycontrolls the width of the dashes. The paint's strokeWidth controlls theheight of the dashes.(参数的说明)

    Note: this patheffect only affects drawing with the paint's style is setto STROKE or STROKE_AND_FILL. It is ignored if the drawing is done withstyle == FILL.(画笔的设置)

示例代码:

public class MyView extends View{

    int phase ;
    public MyView(Context context) {
        super(context);
        phase = 0;
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        phase = 0;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        setBackgroundColor(Color.CYAN);

        Paint p = new Paint();
        p.setAntiAlias(true);
        p.setColor(Color.WHITE);
        p.setStyle(Paint.Style.STROKE);
        p.setStrokeWidth(2.0f);
        DashPathEffect dashPathEffect = new DashPathEffect(new float[]{8,10,8,10},phase);
        p.setPathEffect(dashPathEffect);

        Path path = new Path();
        path.moveTo(200, 600);
        path.lineTo(800, 600);

        canvas.drawPath(path,p);

        phase++;
        // 重绘,产生动画效果
        invalidate();

    }
}
阅读更多
换一批

没有更多推荐了,返回首页