1. Path常用方法

  • 点操作

    // 设置起始点,(x,y)为绝对路径,(dx,dy)为相对路径moveTo(float x, float y)rMoveTo(float dx, float dy)
  • 线操作

    // 设置线的终点,(x,y)为绝对路径,(dx,dy)为相对路径lineTo(float x, float y)rLineTo(float dx, float dy)
  • 绘制矩形

    // dir是方向,CW是顺时针,CCW是逆时针addRect(RectF rect, Direction dir)addRect(float left, float top, float right, float bottom, Direction dir)// rx是横向,ry是纵向,radii是4对(x,y)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)
  • 绘制椭圆和圆

    addOval(RectF oval, Direction dir)addOval(float left, float top, float right, float bottom, Direction dir)addCircle(float x, float y, float radius, Direction dir)
  • 绘制圆弧

    // startAngle是圆弧开始角度,sweepAngle是圆弧经过的角度addArc(RectF oval, float startAngle, float sweepAngle)addArc(float left, float top, float right, float bottom, float startAngle,        float sweepAngle)// forceMoveTo是否强制将path最后一个点移动到圆弧起点// arcTo会推断要绘制圆弧的起点与之前最后的点是否是同一个点,假设不是同一个点的话,就会连接两个点arcTo(RectF oval, float startAngle, float sweepAngle,            boolean forceMoveTo)arcTo(RectF oval, float startAngle, float sweepAngle)arcTo(float left, float top, float right, float bottom, float startAngle,        float sweepAngle, boolean forceMoveTo)

示例代码

Path path = new Path();path.moveTo(50, 50);path.lineTo(200, 100);path.rMoveTo(50, 0);path.rLineTo(100, 100);path.addRect(50, 250, 300, 350, Path.Direction.CW);path.addRoundRect(50, 400, 300, 500, 20, 10, Path.Direction.CW);path.addRoundRect(400, 400, 650, 500, new float[]{10, 20, 10, 20, 20, 10, 20, 10},        Path.Direction.CW);path.addOval(50, 550, 300, 700, Path.Direction.CW);path.addCircle(525, 625, 75, Path.Direction.CW);path.addArc(50, 750, 300, 900, 0, 180);path.addArc(400, 750, 650, 900, 90, 225);path.arcTo(50, 950, 300, 1100, 0, 180, true);path.arcTo(400, 950, 650, 1100, 90, 225, false);

效果如下

2. Direction类

Direction类主要用于绘制文字时的方向

  • CW是顺时针
  • CCW是逆时针

示例代码

Path path = new Path();path.addOval(50, 50, 300, 200, Path.Direction.CW);canvas.drawPath(path, mRedPaint);canvas.drawTextOnPath("This is a text", path, 0, 0, mBluePaint);path.reset();path.addOval(400, 50, 650, 200, Path.Direction.CCW);canvas.drawPath(path, mRedPaint);canvas.drawTextOnPath("This is a text", path, 0, 0, mBluePaint);

效果如下

3. Path.op方法

op(Path path, Op op)op(Path path1, Path path2, Op op)
  • DIFFERENCE,path1减去path1和path2相交部分

    Path path1 = new Path();path1.addCircle(150, 150, 75, Path.Direction.CW);Path path2 = new Path();path2.addCircle(250, 150, 75, Path.Direction.CW);path1.op(path2, Path.Op.DIFFERENCE);canvas.drawPath(path1, mRedPaint);
  • INTERSECT,path1和path2相交部分

  • UNION,path1和path2并集

  • XOR,与INTERSECT刚好相反

  • REVERSE_DIFFERENCE,与DIFFERENCE刚好相反

效果如下

4. FillType类

我们要给一个图形内部填充颜色,首先需要分清哪一部分是外部,哪一部分是内部,具体可参考安卓自定义View进阶 - Path

  • WINDING,非零环绕数规则,Path中任何线段都是有方向性的,从右到左穿过射线时,环绕数加1,从左到右时,环绕数减1,非0表示这个点在曲线内部,0表示这个点在曲线外部
  • EVEN_ODD,奇偶规则,从点发射线与图形相交,偶数在图形外部,奇数在图形内部
  • INVERSE_WINDING,与WINDING相反
  • INVERSE_EVEN_ODD,与EVEN_ODD相反

效果如下

5. 其他方法

  • setLastPoint(float dx, float dy),改变前面操作中最后点的位置
  • reset(),清除内容,重置到初始状态
  • rewind(),清除内容,但会保留相关的数据结构
  • offset(float dx, float dy),平移当前Path
  • close(),闭合当前路径

相关文章
Android Path类
Android Paint类
Android Canvas类

更多相关文章

  1. [置顶] 一个绚丽的loading动效分析与实现!
  2. 跟着徐宜生学Android——
  3. android opengl es添加纹理,绘制立方体纹理,立方体使用不同纹理
  4. Android(安卓)Shader 颜色、图像渲染 paint.setXfermode
  5. AndroidView绘制流程一(View添加流程)
  6. Android(安卓)View 绘制流程
  7. Android难点之——自定义View(上)
  8. Android(安卓)Activity 图形化生成简读
  9. android 8.0 自定义控件onmesure获取宽度为0

随机推荐

  1. Android(手机)连接电脑本地服务器(flask)
  2. Android 学习笔记8---SAX和DOM解析XML文
  3. Android Studio开发环境搭建手记
  4. Android 4.4(KitKat)中VSync信号的虚拟化
  5. android TabHost(选项卡)的使用方法
  6. Android(安卓)8.1 从零开始写 HAL -- (3)
  7. Android ZBar bar code reader二维码
  8. 搭建Android开发环境写第一个Hello World
  9. Unable to instantiate activity Compone
  10. Android终端命令执行编译命令()