path绘制

drawPath(Path path, Paint paint) 画自定义图形

drawPath(path) 这个方法是通过描述路径的方式来绘制图形的,它的 path 参数就是用来描述图形路径的对象

Path 可以描述直线、二次曲线、三次曲线、圆、椭圆、弧形、矩形、圆角矩形。

把这些图形结合起来,就可以描述出很多复杂的图形。

Path有两类方法,一类是直接描述路径的,另一类是辅助的设置或计算

Path 方法第一类:直接描述路径

这一类方法还可以细分为两组:添加子图形和画线(直线或曲线)

第一组: addXxx() ——添加子图形

addCircle(float x, float y, float radius, Direction dir) 添加圆
addOval(float left, float top, float right, float bottom, Direction dir) / addOval(RectF oval, Direction dir) 添加椭圆
addRect(float left, float top, float right, float bottom, Direction dir) / addRect(RectF rect, Direction dir) 添加矩形
//添加圆角矩形
addRoundRect(RectF rect, float rx, float ry, Direction dir) 
addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir) 
addRoundRect(RectF rect, float[] radii, Direction dir) 
addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir)
addPath(Path path) 添加另一个 Path

  

第二组:xxxTo() ——画线(直线或曲线)

// 画直线
lineTo(float x, float y) 
rLineTo(float x, float y) 

当前位置向目标位置画一条直线, x 和 y 是目标位置的坐标 

lineTo(x, y) 的参数是绝对坐标,而 rLineTo(x, y) 的参数是相对当前位置的相对坐标(前缀 r 指的就是 relatively) 

//  画二次贝塞尔曲线
quadTo(float x1, float y1, float x2, float y2) 
rQuadTo(float dx1, float dy1, float dx2, float dy2)
// 画三次贝塞尔曲线
cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 
rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 

 

// 移动到目标位置
moveTo(float x, float y) 
rMoveTo(float x, float y) 

  

第二组还有两个特殊的方法: arcTo() 和 addArc()。它们也是用来画线的,但并不使用当前位置作为弧线的起点。

//  画弧形
arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) 
arcTo(RectF oval, float startAngle, float sweepAngle)

  

这个方法和 Canvas.drawArc() 比起来,少了一个参数 useCenter,而多了一个参数 forceMoveTo

少了 useCenter ,是因为 arcTo() 只用来画弧形而不画扇形,所以不再需要 useCenter 参数;

而多出来的这个 forceMoveTo 参数的意思是,绘制是要「抬一下笔移动过去」,还是「直接拖着笔过去」,区别在于是否留下移动的痕迹。

(如果画完一条线之后再画另一条线,而两条线时隔开的话,forceMoveTo为true,就会将笔拖着过去,也就是这两条线还是会连起来。)

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) 
addArc(RectF oval, float startAngle, float sweepAngle)

 addArc()只是一个直接使用了 forceMoveTo = true 的简化版 arcTo() 

close() 封闭当前子图形

  

Path 方法第二类:辅助的设置或计算

    Path.setFillType(Path.FillType ft) 设置填充方式

FillType 的取值有四个:

  • EVEN_ODD (奇偶原则)
  • WINDING (默认值)(非零环绕数原则)
  • INVERSE_EVEN_ODD
  • INVERSE_WINDING
EVEN_ODD 和 WINDING 的原理
EVEN_ODD(奇偶原则  even_odd rule)

非零环绕数规则和奇-偶规则(Non-Zero Winding Number Rule&&Odd-even Rule)

 

 

 

  

猜你喜欢

转载自www.cnblogs.com/huyang011/p/9553647.html