代码地址如下:
http://www.demodashi.com/demo/14754.html

####前言
之前讲过Paint和Canvas的基本使用,今天来介绍下Path的使用
涉及内容有:

  1. Path画直线路径
  2. Path画弧线路径
  3. PathView引用说明
  4. 项目结构图和效果图

#####一. Path画直线路径
Path画直线路径的步骤分三步:
第一步:设置path的起点,代码如下:

path.moveTo(float x,float y);//设置path的起点

第二步:设置下一个路径点,代码如下:

path.lineTo(float x,float y);//设置下一个路径点

注意:path的lineTo方法可以不断使用。
第三步:封闭形成闭环,代码如下:

path.close();

注意:第三步的调用不是必须的,只有当你连续LineTo了几条直线以后,想形成一个封闭的空间的时候,可以直接调用此方法,而不用又费力的调用lineTo回到原点。
#####二. Path画弧线路径
path画弧线的方法常用的有如下几个:

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo);
arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) ;

其实第一个和第二个大同小异,只是第一个是传入一个RectF,而第二个是直接将构造RectF的参数传进去而已。这里以讲解

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo);

为例,方法很简单,但是理解是个问题。下面着重介绍arcTo方法的几个参数的意义,帮助大家理解。
######2.1 RectF oval 参数
书本解释是:生成椭圆的矩形。
这里大家注意一点,如果矩形是长方形,那么生成的是椭圆,如果矩形是正方形的时候,生成的就是圆了。
这里解释让人感觉生硬,不好理解,那么这个RectF和弧线到底啥关系,让我们用代码解释:

        //设置paintPaint paint=new Paint();paint.setColor(Color.RED);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);//设置PathPath path=new Path();RectF rectF=new RectF();rectF.set(340,350,740,550);//画矩形canvas.drawRect(rectF,paint);paint.setColor(Color.BLUE);path.arcTo(rectF,0,90,false);//画弧线canvas.drawPath(path,paint);

效果图如下:

测试矩形画弧线


下面看下,当矩形为正方形的情况:

        //设置paintPaint paint=new Paint();paint.setColor(Color.RED);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);//设置PathPath path=new Path();RectF rectF=new RectF(340,600,740,1000);//画正方形canvas.drawRect(rectF,paint);//画弧线paint.setColor(Color.BLUE);path.arcTo(rectF,0,90,false);canvas.drawPath(path,paint);

效果图如下:

测试正方形画矩形


由上两个示例不难看出,RectF和弧线的关系是,RectF是弧线所在圆或椭圆的外切矩形,当RectF为长方形的时候,弧线为其内切椭圆上的一段轨迹,当RectF为正方形的时候,弧线为其内切圆上的一段轨迹,也不难推断,弧线所在几何中心或圆心即为RectF的几何中心。
######2.2 float startAngle, float sweepAngle 参数
书本解释:
float startAngle:弧开始的角度,以x轴正方向为0度
float sweepAngle:弧持续的弧度
在2.1中,我设置的画弧代码均是:

path.arcTo(rectF,0,90,false);

即 startAngle=0,sweepAngle =90,与上面的书本解释相结合,我们可以这样理解,当弧线切线角度为0°的时候开始画弧,直到当弧线的切线角度为90°的时候,停止画弧。
######2.3 boolean forceMoveTo 参数
在Path画图的过程中,除了addXXX系列函数和moveTo()方法外,路径默认都是连贯的。而forceMoveTo 则是设置弧线与画弧线之前的“最后一笔”是否强制不连接。当 forceMoveTo =false 时,表示连接,当 forceMoveTo =true时,表示不连接。
下面以示例说明:
当 forceMoveTo =false时:

        Paint paint=new Paint();paint.setColor(Color.GREEN);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);Path path=new Path();path.moveTo(540,1400);//设置path初始点,模仿画弧前"最后一笔"//画弧线RectF rectF=new RectF(50,1050,490,1350);path.arcTo(rectF,0,90,false);canvas.drawPath(path,paint);

效果图:

测试forceMoveTo=false


当 forceMoveTo =true 时:

        Paint paint=new Paint();paint.setColor(Color.GREEN);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);Path path=new Path();path.moveTo(540,1400);//设置path初始点,模仿画弧前"最后一笔"//画弧线RectF rectF=new RectF(50,1050,490,1350);path.arcTo(rectF,0,90,true);canvas.drawPath(path,paint);

效果图如下:

测试forceMoveTo=true


######2.4 arcTo 方法需要注意的地方
Path的 arcTo 方法是用来画弧线的,不能用来画圆,当你代码如下设置的时候:

path.arcTo(rectf,0,360,true);

时,将无法画出一个圆,因为弧的弧度不能为360°,当你设置的度数大于360°的时候,实际画出的弧度为你设置的度数减去360°得到的度数,例如下面:

        //设置画笔Paint paint=new Paint();paint.setColor(Color.BLACK);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(5);//设置路径Path path=new Path();RectF rectF=new RectF(590,1050,1030,1350);path.arcTo(rectF,0,400,true);canvas.drawPath(path,paint);

效果图如下:

超过360度


#####三. PathView引用说明
所有的测试代码我都封装到了PathView控件中,下面贴出PathView中主要代码:

        //初始化init(canvas);//path画直线drawLinePath(canvas);//Path画弧线drawArcPath(canvas);//测试画弧线drawActPathTest(canvas);//测试长方形和弧线的关系testOneArcTo(canvas);//测试正方形和弧线的关系testTwoArcTo(canvas);
//        //测试 forceMoveTo =false
//        testForceMoveTo(canvas,false);//测试 forceMoveTo =truetestForceMoveTo(canvas,true);//测试度数超过360testMore360(canvas);

PathView在MainActivity对应的activity_main.xml中的引用如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.android.testdemo.main.MainActivity"><com.android.testdemo.function.PathViewandroid:layout_width="match_parent"android:layout_height="match_parent"/></android.support.constraint.ConstraintLayout>

#####四. 项目结构图和效果图

项目结构图

效果图


Path画直线与弧线

代码地址如下:
http://www.demodashi.com/demo/14754.html

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

Path画直线与弧线相关推荐

  1. msdn画圆弧函数_画直线不简单!python-matplotlib告诉你为什么

    1 说明: ====== 1.1 python的matplotlib画直线,看似简单,其实很难,从简单到复杂,逐步深入,小白秒懂. 1.2 内容:画直线,画圆,画圆点,动画的单摆和圆套圆,好东西在后面 ...

  2. Silverlight学习笔记三(鼠标点击动态画直线|动态设置Ellipse的Canvas.Top与Canvas.Left|动态设置Stroke属性的方法。)...

    我有可能需要把AutoCAD的部分功能搬到浏览器上,先练习一下画直线的方法.如图: MainPage.xaml代码: 大气象 <UserControl x:Class="DrawLin ...

  3. c语言图形学画扇形代码,WPF画图の利用Path画扇形(仅图形)(示例代码)

    原文:WPF画图の利用Path画扇形(仅图形) 一.画弧 Path继承自Sharp,以System.Windows.Shapes.Shape为基类,它是一个具有各种方法的控件. 我们先看一段xaml代 ...

  4. Swift-贝赛尔曲线画扇形、弧线、圆形、多边形——UIBezierPath实现App下载时的动画效果

    上篇文章提到了使用贝赛尔曲线实现画图板(传送门),顿时就对贝赛尔曲线兴趣大增有木有. 之所以接触贝赛尔曲线,多亏了师父.周五下班前师父给我留了个任务,让我周末回家研究研究 iPhone 手机下载 Ap ...

  5. C# 画(绘制)直线 C#如何画直线 C#绘制直线 WPF 画(绘制)直线

    C#画直线 1.winform 使用的是 Graphics private void Form1_Paint(object sender, PaintEventArgs e) { Graphics g ...

  6. java画出斜椭圆_【转】画图java源代码,只画直线,矩形,椭圆

    /* *只画直线,矩形,椭圆,只能向右下角画 * *PainterPanel extends JPanel implements MouseListener *addMouseListener(thi ...

  7. python画圆简单代码-Python画直线 画圆 画矩形代码

    时间:2018-11-27 概述:画图 Python画图的一些例子代码,学用rectangle画方形.利用for循环控制100-999个数,每个数分解出个位,十位,百位.程序源代码: from tki ...

  8. opencv画直线,矩形

    opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...

  9. 画直线_在鸡的面前画直线,鸡为什么会晕呢,西瓜视频带你揭秘

    不知道你们有没有看过这样一个视频,把鸡按在地上,然后在它的面前画一条直线,在直线画完的时候,按着鸡的人把手松开,结果鸡一动不动,好像是被催眠了一样.视频一出很多网友都纷纷开始模仿,并且都成功了,这到底 ...

最新文章

  1. 优化算法之手推遗传算法(Genetic Algorithm)的详细步骤图解
  2. ejs模板引擎的使用
  3. (转载)Struts2源码粗略分析四:理解xwork工作原理
  4. C#中ToString()格式大全(转)
  5. java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...
  6. 最热开源静态网站生成器 TOP 20
  7. 企业做网络推广关键词设置的几点个人看法
  8. python可以手眼定标吗_手眼标定 相关实例(示例源码)下载 - 好例子网
  9. mfc之使用控制台Console输出调试信息
  10. irf和链路聚合综合实验
  11. 【转载】偏最小二乘法回归(Partial Least Squares Regression)
  12. java 获取保存存储路径配置文件
  13. visio画图复制粘贴到word_用VISIO画图 复制完之后粘贴到word中为什么只显示下面一部分?...
  14. Android GPS应用开发
  15. docx文档文字怎么加边框,WORD文档给文字加的边框,如何调大小
  16. 华为社招16级待遇2020_2020年3月16日乌鲁木齐沙依巴克区发生3.5级地震简报
  17. 19【推荐系统16】CTRCVR联合学习
  18. 中国社交产品十年记....
  19. 小度总显示服务器连接失败,小度本地端口分配失败是什么意思
  20. k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令

热门文章

  1. 有源蜂鸣器的驱动设计
  2. 13001.udp广播接收程序(python)
  3. STM32 IIC详解
  4. c#读蓝牙数据_C#读取BWT901CL蓝牙传感器的数据
  5. python 24位图转 8位_Python爬取PPT模板小工具下载-Python爬取PPT模板小工具免费版下载v1.0...
  6. 【C语言】矩阵的最大值(指针专题)
  7. 从程序员到项目经理(九):程序员加油站 -- 再牛也要合群
  8. ROS:定制自己的消息类型msg
  9. KNN算法(K近邻学习)
  10. mysql 双机异地热备份—-mysql主从,主主备份原理及实践