主要内容:
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);
//添加到集合中去
}