Android-高级-UI-进阶之路--(六)-PathMeasure-制作路径动画

本文详细介绍了Android中的Path对象,包括其API功能如moveTo、lineTo、setLastPoint等,以及如何使用PathMeasure进行路径追踪和计算。此外,还展示了如何在自定义View和触摸事件处理中应用Path。
摘要由CSDN通过智能技术生成

Path

Path 又叫路径,它是一个比较重要的概念,在自定义 View 中它的重要程度基本上跟 Paint 差不多,那么它可以用来干什么勒, 可以说 Path 是万能的也不为过,为什么这么说呢,因为只要给我任何一个 Path 路径,我就能把它绘制出来。下面我们先来熟悉一下它有哪些 API 吧,请看下表:

API 功能 说明
moveTo 移动起点 移动下一次操作的起点位置
setLastPoint 设置终点 重置当前 path 中最后一个点位置,如果在绘制之前调用,效果和 moveTo 相同
lineTo 连接直线 添加上一个点到当前点
close 闭合路径 连接第一个点到最后一个点,形成一个闭合区间
addRect,addRoundRect,addOval,addCircle,addPath,addArc,arcTo 添加内容 添加(矩形,圆角矩形,椭圆,圆,路径,圆弧)到当前 Path 中
isEmpty 是否为空 判断当前 Path 是否是空的
isRect 是否为矩形 判断 Path 是否是一个矩形
set 替换路径 用新的路径替换到当前路径的所有内容
offset 偏移路径 对当前路径之前的操作进行偏移(不会影响之后的操作)
quadTo,cubicTo 贝塞尔曲线 分别为二次和三次贝塞尔取消的方法
rMoveTo, rLineTo,rQuadTo,rCubicTo rXXX方法 不带 r 的方法时基于远点的坐标系(偏移量),rXXX 方法是基于当前点坐标系(偏移量)
setFillType, getFillType,isInverseFilltype,toggleInverseFilltype 填充模式 设置,获取,判断和切换填充模式
incReserve 提示方法 提示 Path 还有多少个点等待加入
op 布尔操作 对2个Path进行布尔运算(取交集并集)
computeBounds 计算Path 的边界 计算边界
reset,rewind 重置路径 清除Path中的内容,reset不保留内部数据结构,但会保留 Filltype,rewind会保留内部的数据结构,但不保留 FillType
transform 矩阵操作 矩阵变换
  1. moveTo,lineTo,setLastPoint,close

//从0.0 连接 400,600
mPath.lineTo(400f,600f)
//重置上一点相当于 0,0 到 600,200, 设置之前操作的最后一个点位置(会影响之前跟之后的起始点)
//mPath.setLastPoint(600f,200f)
//从 400,600 连接 900,100
mPath.lineTo(900f,100f)
//开始绘制
anvas!!.drawPath(mPath,mPathPaint)

我们把上面注释放开,如下代码:

//从0.0 连接 400,600
mPath.lineTo(400f,600f)
//重置上一点相当于 0,0 到 600,200, 设置之前操作的最后一个点位置(会影响之前跟之后的起始点)
mPath.setLastPoint(600f,200f)
//从 600,200 连接 900,100
mPath.lineTo(900f,100f)
//开始绘制
anvas!!.drawPath(mPath,mPathPaint)

实现效果如下:

通过上图我们发现 setLastPoint 设置了之后改变了之前的最后一次的坐标点,可以理解为更新最后一点的坐标,我们发现每次都是从坐标角 (0,0) 开始绘制,那么有没有一个方法指定从哪个起点开始绘制,正好,你可以试试 moveTo 它可以指定 path 的起点,如下代码:

//moveTo 设置起点
mPath.moveTo(600f,200f)
//从0.0 连接 400,600
mPath.lineTo(400f,600f)
mPath.lineTo(800f,300f)
//最后一点和起点封闭
mPath.close()

通过上图我们先利用 Path#moveTo 将 Path 起点设置为 (400,600) 开始绘制,最后调用了 Path#close 将为闭合的连接线闭合。

  1. addXxx 系列

我们就以 矩形,圆角矩形,椭圆,圆,圆弧 的顺序绘制

//Path.Direction.CW/CCW 顺时针/逆时针

//1. 添加矩形到 Path
void addRect (float left, float top, float right, float bottom, Path.Direction dir)
//2. 添加 圆角矩形到 Path
void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
//3. 添加 椭圆 到 Path
void addOval (RectF oval, Path.Direction dir)
//4. 添加 圆 到 Path
void addCircle (float x, float y, float radius, Path.Direction dir)
//5. 添加 圆弧 到 Path ,直接添加一个圆弧到path中
void addArc (RectF oval, float startAngle, float sweepAngle)
//添加一个圆弧到 path,如果圆弧的起点和上次最后一个坐标点不相同,就连接两个点
void arcTo (RectF oval, float startAngle, float sweepAngle)
void arcTo (RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

mPathPaint.textSize = 50f
//1. 添加矩形到 Path
mPath.addRect(100f,300f,400f,700f,Path.Direction.CW)//顺时针
canvas!!.drawText(“1”,200f,500f,mPathPaint)

//2. 添加 圆角矩形到 Path
mPath.addRoundRect(100f + 500,300f,1000f ,700f,30f,30f,Path.Direction.CCW)//逆时针
canvas!!.drawText(“2”,800f,500f,mPathPaint)

//3. 添加 椭圆 到 Path
mPath.addOval(100f,1300f,600f ,1000f,Path.Direction.CCW)//逆时针
canvas!!.drawTex

  • 20
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值