主要内容:


1.path线段动画绘制出现(画图,画svg文字等)


2.path路径动画(对象沿着指定的路径进行运动)


3.获取path内的所有点(判断是否触摸在指定区域内)



一、path线段的动画绘制(也可以将SVG格式的文字转换为path之后实现写字效果)



先看网上盗的动态图(注意看里面的线段出现方式,感觉就像拿着笔依次绘制出来的感觉)






DashPathEffect绘制虚线




实现方式(举一个简单例子):


1.先使用Path绘制一个200*200矩形


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




2.使用PathMeasure计算出整个Path的长度


PathMeasure pm = new PathMeasure();
float totalLen = pm.getLength();


timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
percent += 0.04;
        if (percent > 1) {
percent = 1;
}
handler.sendEmptyMessage(0);
}
};
timer.schedule(task, 0, 100);
float dis = totalLen * percent;


handler里面主要是调用了View的invalidate进行重绘



4.使用DashPathEffect绘制路径


PathEffect pe = new DashPathEffect(new float[]{d, len - d}, 0);
paint.setPathEffect(pe);


public DashPathEffect( float intervals[] , float phase);

inervals[] 中第一个值为显示长度,第二个值是间隔长度,第三个值为显示长度,第四个值是间隔长度,以此类推


phase据说是偏移量



这里的原理主要是将整个Path分成两部分,第一部分将需要绘制出来的部分作为显示长度,第二部分将还没有画出来的部分作为间隔长度,从而达到实现效果

canvas.drawPath(path,paint);







二、path路径动画










核心代码为:



float[] curPos = new float[2];
pm.getPosTan(dis,curPos,null);



dis参照以下 path线段的动画绘制 的第3点,主要是距离path起始点的距离





curPos[0] 为x坐标



curPos[1] 为y坐标





拿到这个点了,当然是想干什么干什么





三、获取path内的所有点,判断指定点是否在path内部






1.获取path的边界(即包含它的最小矩形)



RectF rf = new RectF();
path.computeBounds(rf,true);



2.得到Path内所有点的集合



Region region = new Region();
region.setPath(path,new Region((int)rf.left,(int)rf.top,(int)rf.right,(int)rf.bottom));



region.contains(x,y)





注意:以上方法有些边界部分包含不进去,因为RectF据说是一个左闭右开的集合





如果想要包含边界值:



for(int i = 0; i <= pm.getLength(); i ++){
float[] pos = new float[2];
pm.getPosTan(i,pos,null);
    //添加到集合中去
}