代码地址如下:
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和弧线到底啥关系,让我们用代码解释:

        //设置paint
Paint paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
//设置Path
Path 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);

效果图如下:

测试矩形画弧线



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

        //设置paint
Paint paint=new Paint();
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5); //设置Path
Path 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 =true
testForceMoveTo(canvas,true);
//测试度数超过360
testMore360(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.PathView
android:layout_width="match_parent"
android:layout_height="match_parent"/> </android.support.constraint.ConstraintLayout>
四. 项目结构图和效果图

项目结构图

效果图



Path画直线与弧线

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

Path画直线与弧线的更多相关文章

  1. SVG 学习<七> SVG的路径——path(1)直线命令、弧线命令

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  2. WPF画图の利用Path画扇形(仅图形)

    一.画弧 Path继承自Sharp,以System.Windows.Shapes.Shape为基类,它是一个具有各种方法的控件. 我们先看一段xaml代码: <Path Stroke=" ...

  3. 《图形学》实验五:改进的Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用改进的Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h ...

  4. 《图形学》实验四:中点Bresenham算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用中点Bresenham算法画直线. 实验结果: 代码: //中点Bresenham算法生成直线 #include <gl/glut.h& ...

  5. 《图形学》实验三:DDA算法画直线

    开发环境: VC++6.0,OpenGL 实验内容: 使用DDA算法画直线. 实验结果: 代码: #include <gl/glut.h> #include <math.h> ...

  6. Bresenham画直线,任意斜率

    function DrawLineBresenham(x1,y1,x2,y2) %sort by x,sure x1<x2. if x1>x2 tmp=x1; x1=x2; x2=tmp; ...

  7. 几种画直线的方法-孙鑫C++笔记

    // HDC画直线 CPoint m_ptOrigin ; void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { m_ptOrigin ...

  8. 1.1.2-学习Opencv与MFC混合编程之---画图工具 画直线 画圆 画矩形

    源代码地址:http://download.csdn.net/detail/nuptboyzhb/3961685 画图工具 1.     画直线 Ø  增加‘直线’菜单项,建立类向导: Ø  对CXX ...

  9. Python使用DDA算法和中点Bresenham算法画直线

    title: "Python使用DDA算法和中点Bresenham算法画直线" date: 2018-06-11T19:28:02+08:00 tags: ["图形学&q ...

随机推荐

  1. Asp.net WebApi版本控制

    有关web api的版本控制网上有很多,如Web API 版本控制的几种方式 Web API 版本化的介绍 但是具体的code并不多,或者说可以run的demo 不多. 版本控制如果项目一开始还好做关 ...

  2. 遭遇sql server 2005 启动包未能正确加载需要重新安装错误,重装.NET FRAMEWORK经历分析

    开发的机器,系统情况如下: 1.server 2003 sp2 x86 2.补丁安装360 3.升级到IE8 因为担心server 2003 sp2 不能够自动update,最近都是用360打补丁,比 ...

  3. windows钩子(转)

    1. 消息钩子 提示: 如果要设置系统级钩子, 钩子函数必须在 DLL 中. SetWindowsHookEx(   idHook: Integer;  {钩子类型}   lpfn: TFNHookP ...

  4. java正则校验,密码必须由字母和数字组成

    一个匹配数字和字母密码的正则表达式 2011 年 12 月 14 日 | Filed under: 正则表达式 and tagged with: 密码 , 正则表达式 , 零宽断言 一个用户注册功能的 ...

  5. QuickXDev插件自己主动升级后player no exist

      昨晚上QuickXDev插件执行还ok,今天打开电脑启动sublime text2后.右键run with player提示player no exist watermark/2/text/aHR ...

  6. 推文《阿里凑单算法首次公开!基于Graph Embedding的打包购商品挖掘系统解析》笔记

    推文<阿里凑单算法首次公开!基于Graph Embedding的打包购商品挖掘系统解析>笔记 从17年5月份开始接触Graph Embedding,学术论文读了很多,但是一直不清楚这技术是 ...

  7. Centos下配置单元测试工具gtest

    gtest是google提供的一个非常强大的单元测试工具,下载地址:https://code.google.com/p/googletest 我下载的是gtest-1.6.0.拷贝到Centos系统上 ...

  8. RAMPS1.4 3d打印控制板接线与测试3

    RAMPS1.4作为mega2560的拓展板插在mega板子上面.从而让mega板子可以控制3d打印机的工作.ramps上的接线至关重要,接错不仅不能打印,甚至还会烧坏器件和板子.请一定注意. 我的淘 ...

  9. (转)Unity3D工程版本管理方案

    自:http://blog.dou.li/unity3d%E5%B7%A5%E7%A8%8B%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86%E6%96%B9%E6%A1%88 ...

  10. Flask刷新问题

    修改页面中内容,特别是图片后,总是刷新不了.调试时,我常常通过修改端口来解决,从80-99不断改. 服务器部署,也遇到同样问题,重启web服务器,重启计算机都不行,网页已经改过来了,但是图片还是老图片 ...