Android Canvas之Path的详解与使用(二)
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:会出现角有缺陷,在使用需要注意
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
一、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);}
![](/assets/blank.gif)
![](/assets/blank.gif)
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);}
![](/assets/blank.gif)
![](/assets/blank.gif)
2.7关闭当前轮廓 :close
关闭当前轮廓。如果当前点不等于轮廓的第一个点,自动添加线段。
没有调用close()之前:三个点确定两条线
private void close(Path path) {path.moveTo(100,100);path.lineTo(100,500);path.lineTo(500,500);
}
![](/assets/blank.gif)
调用close():三个点,首位相连
private void close(Path path) {path.moveTo(100,100);path.lineTo(100,500);path.lineTo(500,500);path.close();}
![](/assets/blank.gif)
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);}
![](/assets/blank.gif)
![](/assets/blank.gif)
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的详解与使用(二)相关推荐
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- android OKHttp的基本使用详解
今天,简单讲讲Android里如何使用OKHttp. Android框架系列: 一.android EventBus的简单使用 二.android Glide简单使用 三.android OKHttp ...
- Android网络开发技术实战详解
<Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...
- JNI开发之-Android.mk和Application.mk 详解
Android.mk和Application.mk 详解 Android.mk 基础知识 变量和宏 NDK 定义的 include 变量 目标信息变量 模块描述变量 NDK 提供的函数宏 Applic ...
- Android项目刮刮奖详解(二)
Android项目刮刮奖详解(一) 前言 上期我们简单地实现了一个画板的功能,用户可以在上面乱写乱画,其实,刮刮奖也是如此,用户刮奖的时候也是乱写乱画的. 刮刮奖原理 一共有两层画布,底层画布存放中奖 ...
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——1.3节搭建Android应用开发环境...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王石磊 , 吴峥,更多章节内容可以 ...
- android strictmode有什么作用,Android严苛模式StrictMode使用详解
StrictMode类是Android 2.3 (API 9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的.举个例子来说,如果开发者在UI线程中进行了 ...
- Android Lint 原理及使用详解
Android Lint 原理及使用详解 Android Lint 是 ADT 16中引入的新工具,用于扫描 Android 项目源中的潜在错误. Lint 是 Android 提供的一个强大的,用于 ...
- Android基础总结: Camera2详解之一 API学习
Camera2的API出来有些年头了,只是赶项目多次使用,没时间好好总结,年终了,正好结合google的官方Camera2demo 和开发中使用的情况,做个详细梳理,研究总结之后,才发现Camera2 ...
最新文章
- centos7 mysql 5.6.38_centos7.4 安装mysql 5.6.38
- 【其他】学习通下载任务点里的PPT三步走
- LG新能源新设首席数字官 首任是英伟达前数据科学家
- springboot细节挖掘(数据初始化)
- Flex中List自己定义itemrenderer渲染问题的解决
- 注塑机摆放间距多少合适_垃圾分类盛行,生产塑料环卫垃圾桶的注塑机怎么选?...
- 吴恩达神经网络和深度学习-学习笔记-7-正则化regularization方法
- 求一个数因数个数c语言,【代码】求一个数的因数和、求优化、顺便也供新人参考算法...
- SpringBoot 生产中 16 条最佳实践
- C语言 同构数的算法
- Speedoffice(excel)如何运用公式通过身份证号码提取出性别
- 经济学入门书籍选择参考(业余爱好者)
- flex: 1到底是什么意思?
- 网站被黑的10大原因
- 预防服务器被攻击的处理方式
- 在react中使用swiper/react
- 内存模型系列(下)- 内存持久性模型(Memory Persistency)
- 数据分析-傅里叶变换
- Python爬虫(第五周)
- Java设计模式-模板模式