Path:

Path类封装复合(多轮廓)几何路径由直线段、二次曲线和三次曲线组成。它可以用画布绘制。drawPath(路径、绘制),填充或笔划(基于绘画的样式),或者可以用于剪裁或绘制路径上的文本。

Path属于路径,路径走多了就变成一种套路,只要我们会解套,那这种套路就是高速公路。路径走完形成闭环,最终形成一个图形。

path的合作伙伴是Paint

Paint:

     paint.setAntiAlias(true);// 设置画笔的style (Paint.Style.FILL填充,Paint.Style.STROKE描边    Paint.Style.FILL_AND_STROKE填充加描边)paint.setStyle(Paint.Style.STROKE);// 设置画笔的颜色paint.setColor(Color.RED);//设置描边宽度paint.setStrokeWidth(10f);

关于setStyle:

1.有人会发现不同的填充效果不一样,比如绘制路径,三个点,描边出来的效果是两条线,而填充模式下是一个三角形的色块。

Paint.Style.FILL_AND_STROKE:会出现角有缺陷,在使用需要注意

paint.setStyle(Paint.Style.STROKE);

paint.setStyle(Paint.Style.FILL);

paint.setStyle(Paint.Style.FILL_AND_STROKE);

一、Path的使用

1.构造一个path对象

1.1:构造一个空对象

public Path()1.2 拷贝一个对象
public Path(Path src) 

二、Path的方法介绍

2.1:moveTo(x,y);

path默认的起始坐标是0,0;如果想改变起始坐标,通过moveTo来设置

    private void moveTo(Path path) {path.moveTo(x, y);path.lineTo(0, 1000);path.lineTo(500, 500);}

图一是没设置moveTo,默认(0,0)坐标,图二是moveTo(100,100)新的坐标点

2.2rLineTo

与lineTo相同,但坐标被视为相对于最后一个此轮廓上的点。如果没有上一个点,则将moveTo(0,0)将自动插入。

说明:这里有三个点A(0,0)B(0,1000)C(1000,0)

rLineTo:从A点到B点,C点的坐标以B点为起点,也就是后一个点以前一个坐标为起点

LineTo:直接将A、B、C三个点按顺序在view中连起来

    private void rLineTo(Path path) {path.rLineTo(0, 1000);path.rLineTo(1000, 0);}

rLineTo


LineTo

2.3贝塞尔曲线:quadTo

public void quadTo(float x1, float y1, float x2, float y2)

一般曲线是由三个点完成,开始,顶点,结束。在而塞尔曲线中,

(x1,y1)为曲线的顶点

(x2,y2)为曲线的结束点

开始默认是(0,0),可以通过moveTo来改变

private void quadTo(Path path) {path.moveTo(100, 0);path.quadTo(100, 1000, 1000, 0);}

2.4贝塞尔曲线:rQuadTo

与quadTo相同,但坐标被视为相对于最后一个此轮廓上的点。如果没有上一个点,则将moveTo(0,0)将自动插入。

可参考上方

2.5立方贝塞尔:cubicTo

public void cubicTo(float x1, float y1, float x2, float y2,float x3, float y3) 

从接近控制点的最后一点添加一个立方贝塞尔(x1,y1)和(x2,y2),并在(x3,y3)处结束。如果没有moveTo()调用对于此轮廓,第一个点自动设置为(0,0)

    private void cubicTo(Path path) {int width=getWindowSize(0)/2;int height=getWindowSize(1)/2;path.cubicTo(0, height, width, height, width, 0);}

2.6圆弧:arcTo

public void arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo)

将指定的圆弧作为新轮廓附加到路径。如果开始路径与路径的当前最后一点不同,则添加了automatic lineTo()以将当前轮廓连接到弧的起点。但是,如果路径为空,则调用moveTo()弧的第一点

oval:扇形图形view大小

startAngle:开始角度

sweepAngle:扇形角度

forceMoveTo:如果为真,则始终以圆弧开始新轮廓

 private void arcTo(Path path) {paint.setStyle(Paint.Style.FILL);RectF rectF=new RectF(0,0,500,500);path.arcTo(rectF,startAngle,sweepAngle,true);}

paint.setStyle(Paint.Style.STROKE)
 

paint.setStyle(Paint.Style.FILL)

2.7关闭当前轮廓 :close

关闭当前轮廓。如果当前点不等于轮廓的第一个点,自动添加线段。

没有调用close()之前:三个点确定两条线
private void close(Path path) {path.moveTo(100,100);path.lineTo(100,500);path.lineTo(500,500);
}

未调用close()

调用close():三个点,首位相连

    private void close(Path path) {path.moveTo(100,100);path.lineTo(100,500);path.lineTo(500,500);path.close();}

调用close()

2.8将闭合矩形轮廓添加到路径:addRect

public void addRect(RectF rect, Direction dir) 

rect:矩形区域

dir:缠绕矩形轮廓的方向,CW=顺时针,CCW=逆时针

private void addRect(Path path){RectF rect=new RectF(0,0,500,500);path.addRect(rect, Path.Direction.CCW);}

2.9绘制椭圆:addOval

public void addOval(RectF oval, Direction dir)
    private void addOval(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addOval(rect, Path.Direction.CCW);}

注意:如果矩形是正方形绘制出来的图形是圆形

2.10绘制圆形:addCircle

public void addCircle(float x, float y, float radius, Direction dir)

(x ,y):圆心的坐标

radius:半径

    private void addCircle(Path path) {path.addCircle(100, 100, 100, Path.Direction.CCW);}

2.11在矩形区域画弧度:addArc

public void addArc(RectF oval, float startAngle, float sweepAngle)

如果这个矩形是一个正方形,那么画出来的弧度是半圆形,否则是一个不规则的股弧度

    private void addArc(Path path) {paint.setStyle(Paint.Style.STROKE);RectF rect = new RectF(0, 0, 500, 500);path.addArc(rect,0,180);}

private void addArc(Path path) {paint.setStyle(Paint.Style.FILL);RectF rect = new RectF(0, 0, 500, 500);path.addArc(rect,0,180);}

    private void addArc(Path path) {paint.setStyle(Paint.Style.FILL);RectF rect = new RectF(0, 0, 1000, 500);path.addArc(rect,0,180);}

    private void addArc(Path path) {paint.setStyle(Paint.Style.STROKE);RectF rect = new RectF(0, 0, 1000, 500);path.addArc(rect,0,180);}

2.12在矩形中绘制一个圆形:addRoundRect

public void addRoundRect(RectF rect, float rx, float ry, Direction dir)

(rx,ry)代表圆形在矩形中的中心坐标,如果这个坐标正在矩形的正中心,那绘制出来的正好是圆形,否则距离中心远近代表角度的大小

注意:这里面rx或者ry中,只要有一个角的坐标为0,都无法生效。

rx和ry其实看成到各个顶点的角度百分比。

rx=ry,四个角大小是一致,否则不一样

    private void addRoundRect(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,500,100, Path.Direction.CW);}

    private void addRoundRect(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,rect.right/2,rect.bottom/2, Path.Direction.CW);}

    private void addRoundRect(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,100,100, Path.Direction.CW);}

    private void addRoundRect(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,0,0, Path.Direction.CW);}

2.13在path中添加新的path :addPath

1.public void addPath(Path src, Matrix matrix) 
2.public void addPath(Path src)
3.public void addPath(Path src, float dx, float dy)

matrix和(dx,dy)可以指定src在path中的坐标,类似View在viewGroup的坐标。如果没有,默认覆盖在父path的view上,坐标dx=dy=0;

    private void addPath(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,0,0, Path.Direction.CW);Path path1=new Path(path);Matrix matrix=new Matrix();matrix.setTranslate(200,200);path.addPath(path1,100,100);path.addPath(path1,matrix);}

2.14整体偏移 :offset

offset是针对整个path来完成偏移的,而不是某个点,MoveTo是针对起始坐标点

如下:起始坐标是0,0。通过偏移来完成整体的下移

    private void offset(Path path) {RectF rect = new RectF(0, 0, 1000, 500);path.addRoundRect(rect,0,0, Path.Direction.CW);path.offset(100,100);}

2.15重置最后一个点的位置:setLastPoint

正常如下:

    private void setLastPoint(Path path) {path.lineTo(0,1000);path.lineTo(500,1000);
//        path.setLastPoint(500,500);}

正常

path.setLastPoint(500,500)

2.16 path的控制:transform

通过Matrix对path的路径进行控制和操控,比offset更灵活,只要操作Matrix即可完成当前path的变种


三、关于Path绘制路径的常用方法总结

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

Android Canvas之Path的详解与使用(二)相关推荐

  1. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  2. android OKHttp的基本使用详解

    今天,简单讲讲Android里如何使用OKHttp. Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 三.android OKHttp ...

  3. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  4. JNI开发之-Android.mk和Application.mk 详解

    Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...

  5. Android项目刮刮奖详解(二)

    Android项目刮刮奖详解(一) 前言 上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的. 刮刮奖原理 一共有两层画布,底层画布存放中奖 ...

  6. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——1.3节搭建Android应用开发环境...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王石磊 , 吴峥,更多章节内容可以 ...

  7. android strictmode有什么作用,Android严苛模式StrictMode使用详解

    StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...

  8. Android Lint 原理及使用详解

    Android Lint 原理及使用详解 Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误. Lint 是 Android 提供的一个强大的,用于 ...

  9. Android基础总结: Camera2详解之一 API学习

    Camera2的API出来有些年头了,只是赶项目多次使用,没时间好好总结,年终了,正好结合google的官方Camera2demo 和开发中使用的情况,做个详细梳理,研究总结之后,才发现Camera2 ...

最新文章

  1. centos7 mysql 5.6.38_centos7.4 安装mysql 5.6.38
  2. 【其他】学习通下载任务点里的PPT三步走
  3. LG新能源新设首席数字官 首任是英伟达前数据科学家
  4. springboot细节挖掘(数据初始化)
  5. Flex中List自己定义itemrenderer渲染问题的解决
  6. 注塑机摆放间距多少合适_垃圾分类盛行,生产塑料环卫垃圾桶的注塑机怎么选?...
  7. 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
  8. 求一个数因数个数c语言,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
  9. SpringBoot 生产中 16 条最佳实践
  10. C语言 同构数的算法
  11. Speedoffice(excel)如何运用公式通过身份证号码提取出性别
  12. 经济学入门书籍选择参考(业余爱好者)
  13. flex: 1到底是什么意思?
  14. 网站被黑的10大原因
  15. 预防服务器被攻击的处理方式
  16. 在react中使用swiper/react
  17. 内存模型系列(下)- 内存持久性模型(Memory Persistency)
  18. 数据分析-傅里叶变换
  19. Python爬虫(第五周)
  20. Java设计模式-模板模式

热门文章

  1. 什么是netty--通俗易懂
  2. JAVA语言中数字、字符和字符串处理
  3. Unity相册滚动效果
  4. win10 搜索功能失效
  5. Spring-----入门
  6. word打开是乱码怎么恢复?简单的方法
  7. Linux提取nestat -anp 进程参数
  8. python处理excel系列一之根据文件名从一文件夹批量复制文件到新文件夹并进行处理
  9. 利用二维码生成器将字符串生成二维码
  10. 哈工大计算机系统大作业hello