安卓canvas path addArc()与arcTo()方法的区别

android path拆分_Android知识总结——Path常用方法解析 版权声明:本文为博主原创文章,未经博主允许不得转载。系列教程:Android开发之从零开始系列大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论前言:开发过程中很容易忘记一些API的使用方法,网上搜索或者在源码里找也很难短时间内筛选出自己需要的,遂自己将这些知识总结一番常用API解析与示例一、xxxTo方法Path类中提供了一套xxxTo方法,其作用是从起点到终点移动path画笔并绘制线(mo... 阅读详情

在学习自定义view的时候,跟随https://hencoder.com/ui-1-1/的教程写写demo,遇到一个问题,需求是这样的,使用canvas的drawPath()方法绘制一个心形,如下图

需要绘制这个图形
需要绘制一个心形
​​​
​​​​​​

教程给的代码是

public class PathView extends View {

    Paint paint = new Paint();
    Path path = new Path(); // 初始化 Path 对象
    
    ......
    
    {
      // 使用 path 对图形进行描述(这段描述代码不必看懂)
      path.addArc(200, 200, 400, 400, -225, 225);
      path.arcTo(400, 200, 600, 400, -180, 225, false);
      path.lineTo(400, 542);
    }

    @Override
    protected void onDraw(Canvas canvas) {
      super.onDraw(canvas);
      
      canvas.drawPath(path, paint); // 绘制出 path 描述的图形(心形),大功告成
    }
}

后来自己尝试实现的时候,把图形分解了一下,如图

于是,很自然的按照这个步骤来绘制图形,首先 添加左边的弧

path.addArc(100,100,300,300,-225,225);

其次,添加右边的弧

path.addArc(300,100,500,300,180,225);

最后,连接到中间点

path.lineTo(300,450);

开始运行! 

???

 

为什么会这样呢,lineTo不是会把图形没封闭的地方连接起来吗,怎么左边不连呢?

找了一会,发现跟源代码不一样的地方就是第二个弧形的绘制,我用了addArc() 方法,而源代码用的是arcTo()方法,问题肯定在这里,接下来就是找这两个方法的区别了,作者大佬对这两个方法有着如下解释:

 

另外,第二组还有两个特殊的方法: arcTo() 和 addArc()。它们也是用来画线的,但并不使用当前位置作为弧线的起点。

arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) / arcTo(RectF oval, float startAngle, float sweepAngle) 画弧形

这个方法和 Canvas.drawArc() 比起来,少了一个参数 useCenter,而多了一个参数 forceMoveTo 。

少了 useCenter ,是因为 arcTo() 只用来画弧形而不画扇形,所以不再需要 useCenter 参数;而多出来的这个 forceMoveTo 参数的意思是,绘制是要「抬一下笔移动过去」,还是「直接拖着笔过去」,区别在于是否留下移动的痕迹。

paint.setStyle(Style.STROKE);
path.lineTo(100, 100);
path.arcTo(100, 100, 300, 300, -90, 90, true); // 强制移动到弧形起点(无痕迹)

paint.setStyle(Style.STROKE);
path.lineTo(100, 100);
path.arcTo(100, 100, 300, 300, -90, 90, false); // 直接连线连到弧形起点(有痕迹)

addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle) / addArc(RectF oval, float startAngle, float sweepAngle)

又是一个弧形的方法。一个叫 arcTo ,一个叫 addArc(),都是弧形,区别在哪里?其实很简单: addArc() 只是一个直接使用了 forceMoveTo = true 的简化版 arcTo() 。

paint.setStyle(Style.STROKE);
path.lineTo(100, 100);
path.addArc(100, 100, 300, 300, -90, 90);

 

 按这个理解,使用arcTo()方法,forceMoveTo参数值为true的时候,相当于直接将笔提起来,从另一个点开始绘制第二段弧,虽然这一段弧的起点与第一段弧有重叠的部分,但是,在计算机看来,这跟之前的弧形已经是不封闭的另一个图形了,因此,在接下来使用lineTo()方法将图形封闭的时候,封闭的只是第二段弧与中心点组成的图形,也就形成了我上面出现的不完整心形图案

为了证实上面的结论,我将第二段弧形的起始位置故意往右偏移了一小段,使它不与第一段弧相交,得到的图案如下:

 path.addArc(100,100,300,300,-225,225);
 path.arcTo(350,100,500,300,180,225,true);

 

 

可以看到,当forceMoveTo参数值为true时,整个图形其实是分成了两个封闭图形,之前由于两个图形相交,视觉上看不出来。

把forceMoveTo的值改为false,使“笔迹”不断,这样的话所有的图形连在一起,是一段封闭图形

 path.addArc(100,100,300,300,-225,225);
 path.arcTo(350,100,500,300,180,225,false);

 

 

最后,总结一下这个事的结论,

addArc() 只是一个直接使用了 forceMoveTo = true 的简化版 arcTo()

forceMoveTo的值决定图案是否连续,也就间接决定了调用path.close()时,封闭图形的连接

 

2019年11月4日18:05:48
解答问题:arcTo方法的最后一个参数forceMoveTo的含义是“是否强制移动绘制点”,如果这个值为true,代表
强制移动了当前绘制点的位置,这样的话后续绘制的图形与之前绘制的图形是分隔开的,调用path.close()方法
的时候不会连接之前绘制的点了;这个值为false的时候,会将接下来的绘制点与之前的图形最后一个绘制点连接起来,
这样的话,之前绘制的图形与之后绘制的图形还是一个整体,调用path.close()方法的时候会将未封闭的图形连接起来。
addArc()方法本质上是一个forceMoveTo参数值为true的arcTo()方法
ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三) TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。 阅读详情

相关推荐

ml307 二次开发

中移物联网旗下4g模组官方网站官方教程id=514官方客户不知道啥时候上班 早上10点也说不在服务时间内 找不到官方的sdk下载路径。

myWorld001的博客 2878

android 用Path 绘制各种图形,Path的方法解析

Path主要用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案 方法列表: reset()                            lineTo(float x, float y) moveTo(float x, float y) close() path.addArc(oval, startAngle, sweepAngle) arcTo(Rect

legend12300的专栏 7433

芯片良率提升:从设计到制造的系统性工程实践

在半导体制造领域,良率是衡量生产效率和成本控制的核心指标,直接关系到芯片的经济效益与市场竞争力。其本质是合格芯片占总产出芯片的百分比,提升良率需要从设计源头到制造末端的全流程协同优化。从技术原理看,它涉及可制造性设计、工艺过程控制、缺陷检测与根因分析等多个复杂环节,尤其在先进制程下,随机缺陷和参数变异成为主要挑战。其技术价值不仅在于降低单颗芯片成本,更能加速产品上市、保障可靠性,并成为企业技术实力的关键体现。应用场景贯穿智能手机、数据中心、自动驾驶和人工智能等所有高端芯片领域。本文将结合【芯片制造】与【良率

weixin_42526068的博客 632

android path 详解

Path主要用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案 方法列表: reset()                            lineTo(float x, float y) moveTo(float x, float y) close() path.addArc(oval, startAngle, sweepAngle) arcTo(Re

代码猫 1942

用matlab编程求矩阵的极大无关组,向量组极大无关组表示问题

已知向量组T:Eqn11.gif (3.16 KB, 下载次数: 1)2013-10-21 19:19 上传.(1) 求向量组T的秩,并判断向量组T的相关性;(2) 求T的极大线性无关组;(3) 将其余的向量用所求的极大线性无关组线性表示。程序:>> A=[1 1 3 2;-1 1 -1 3;5-2 8 9;-1 3 1 7]>> r=rank(A)>> A1=...

weixin_35094083的博客 7385

OpenCv案例(七): 基于OpenCvSharp计算图像的清晰度(自动对焦)

自动对焦,其实是对相机成像的清晰值得计算,若对焦不清晰,成像的清晰度低,视觉效果模糊。若是在工业检测行业,对焦不准确,可能会造成严重后果;对焦准确的图像,其清晰度高,对比度鲜明,层次明显。

qq_37835727的博客 7113

Path方法

1、Path常用方法 作用 相关方法 备注 移动起点 moveTo 移动下一次操作的起点位置 设置终点 setLastPoint 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 连接直线 lineTo 添加上一个点到当前点之间的直线到Path 闭合路径 close 连接第一个点连接到最后一个...

Cake撞见Gym 516

Cadence Virtuoso实战:3分钟搞定反相器参数化设计(附CDF配置避坑指南)

本文详细介绍了如何在Cadence Virtuoso中利用CDF参数传递功能实现反相器的参数化设计,包括PMOS和NMOS的基础搭建、CDF配置技巧及常见报错解决方案。通过实战案例和避坑指南,帮助工程师快速掌握高效设计方法,提升集成电路设计效率。

weixin_28292761的博客 334

Android Path 使用 解析

最近看了一些关于android path的使用,这里做个总结,方便以后查阅   Path主要用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案 方法列表:   reset()                            lineTo(float x, float y) moveTo(float x, float y) close() path.addArc(oval...

w124374860的专栏 3万+

swl安装无法与服务器建立链接,如何解决?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 2075

【Unity Shader】Special Effects(十二)Glow 外发光(UI)

Properties_GlowColor ("外发光颜色", Color) = (0, 0, 0, 1)_GlowIntensity("外发光强度", Range(0, 1)) = 1参数详解:_GlowColor:外发光颜色,指定外发光的显示颜色。_GlowIntensity:外发光强度,指定外发光的显示强度,0为不可见,1为最强强度。

神码编程 931

android canvas 简书,Android#Canvas

Path1.关于Path#addArc()和arcTo()实验1Path path = new Path();RectF rectF = new RectF(200,200,400,400);path.addArc(rectF, 135, 225);RectF rectF1 = new RectF(400,200,600,400);path.addArc(rectF1,180,225);path....

weixin_35160938的博客 205

手把手教你学Simulink实例:基于Simulink的超级电容器充放电仿真

超级电容器(Supercapacitor)是一种高容量电容器,具有快速充放电能力、长寿命和高功率密度等优点。它在能量存储系统、电动汽车、不间断电源(UPS)等领域有广泛应用。为了更好地理解和设计超级电容器的应用系统,通常需要进行详细的仿真分析。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证超级电容器充放电系统的控制策略。本教程将详细介绍如何使用 Simulink 进行超级电容器充放电的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行超级电容器充放电的仿真实例。

MHD0815的博客 581

android addarc,Android自定义View(七)Canvas学习

一、介绍Canvas之为画布,但是并不是真的直接在Canvas画,而是bitmap默认会创建一个bitmap,也可以通过构造方法或者setBitmap方法传入,像素所有的信息画在了这个bitmap上。二、drawBitmap()共有6个重载方法,但是其中两个参数最多的已经废弃掉了,那么就学习4个吧!在draw方法中,有一个很牛逼的方法:drawBitmapMesh,但是一般不会用到。简单处理图片我...

weixin_29737207的博客 652

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

安卓自定义View进阶-Path之基本操作

在上一篇Canvas之图片文字中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多炫(zhuang)酷(B)的东东了。 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版...

johnyin2015的博客 228

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

自定义View中Canvas之Path的详解

上一篇Canvas的绘制图形只能绘制一些常规的,比如点、线、圆、椭圆、矩形等的。如果想要绘制更复杂的图形,那么就得靠Path了。 Path的定义: Path类将多种符合路径(多个轮廓,如直线段、二次曲线、立方曲线等)封装在其内部的几何路径。 Path的绘制: 通过设置Paint.Style的FILL(只描内容)、STROKE(只描边)、FILL_AND_STROKE(描边和内容),然后调用...

LayneYao的博客 5856

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

安卓自定义View进阶:Path基本操作

在上一篇Canvas之图片文字中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多炫(zhuang)酷(B)的东东了。 一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API

sinat_28238111的博客 346

Android自定义View(八)_Path之基本操作

在上一篇Canvas之图片文字中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多炫(zhuang)酷(B)的东东了。一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.

YuKuoYuan的博客 931

Android Canvas之Path操作

接上篇,Android自定义View工具:Paint&Canvas(二) 上一篇中介绍的Canvas绘制图形只能画一些常规图形(圆,椭圆,矩形等),如果想绘制更复杂的图形,Path神器来了! Path是什么? Path类将多种复合路径(多个轮廓,如直线段、二次曲线、立方曲线)封装在其内部的几何路径。 如何绘制Path: 通过设置Paint的Style(FILL、STROK

万物weiyi 3257

安卓自定义View基础09--Path之基本操作

在上一篇Canvas之图片文字中我们了解了如何使用Canvas中绘制图片文字,结合前几篇文章,Canvas的基本操作已经差不多完结了,然而Canvas不仅仅具有这些基本的操作,还可以更加炫酷,本次会了解到path(路径)这个Canvas中的神器,有了这个神器,就能创造出更多炫(zhuang)酷(B)的东东了。一.Path常用方法表 为了兼容性(偷懒) 本表格中去除了部分API21(即安卓版本5.

wzgbgz的博客 157

自定义控件学习笔记(二)drawPath()

drawPath(Path path, Paint paint) 这个方法是通过描述路径的方式来绘制图形的,它的 path 参数就是用来描述图形路径的对象。path 的类型是 Path ,使用方法大概像下面这样:public class PathView extends View { Paint paint = new Paint(); Path path = new Path();

yy471101598的博客 1万+

精致自绘渐变进度条-Path/Paint.setXfermode

日常产品需求开发中进度条自绘是经常需要的,如下: 思路 1,如图1,绘制左端半圆部分 通过canvas.drawArc即可 2,如图2,绘制左半圆和中间矩形部分 通过canvas.drawArc和canvas.drawRect即可 3,如图3和图4,绘制右半圆部分 绘制左半圆->绘制矩形->绘制右半圆部分(通过Path取得BEFC封闭区域部分如图4,或...

DaltSoftware的博客 881

Canvas&Paint 知识梳理(6) 绘制路线 Path 基本用法

一、概述 在实际的开发当中,我们经常会涉及到绘制路径,这里我们总结一下Path的常用API。 二、基本用法 对于一个Path来说,它其中有很多的”子路径“,对于每个”子路径“,它又会有两个变量,"源点"和"当前点",也就是源码当中所描述的: The Path class encapsulates compound (multiple contour) geometric paths 复制代码2.1...

weixin_33676492的博客 224

Android自定义 View(持续更新)

来自 http://hencoder.com/一,绘制自定义绘制的方式是重写绘制方法,其中最常用的是 onDraw()绘制的关键是 Canvas 的使用 Canvas 的绘制类方法: drawXXX() (关键参数:Paint)Canvas 的辅助类方法:范围裁切canvas.clipXXX()和几何变换canvas.setMatrix();可以使用不同的绘制方法来控制遮盖关系1.paintPai...

GY_Rain的博客 338
上一篇: (转)解决sublime text 3使用Install Package时出现There are no packages available for installation问题
Java_noob1
博客等级 码龄11年 1粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值