天天看点

Android 关于路径Path的那些效果一、path线段的动画绘制(也可以将SVG格式的文字转换为path之后实现写字效果)二、path路径动画三、获取path内的所有点,判断指定点是否在path内部

主要内容: 1.path线段动画绘制出现(画图,画svg文字等) 2.path路径动画(对象沿着指定的路径进行运动) 3.获取path内的所有点(判断是否触摸在指定区域内)

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

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

gif图太大传不上来,看 https://github.com/romainguy/road-trip里面的图就行

核心为使用 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();      

3.开启一个线程动态增加已绘制出来的部分长度

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路径动画

http://www.2cto.com/kf/201503/380377.html

核心代码为:

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

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

通过PathMeasure计算出路径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));      

3.判断x,y是否在Path内

region.contains(x,y)      

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

如果想要包含边界值:

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