Android自定义view之基础canvas.drawPath方法

Android-高级-UI-进阶之路-(五)-看完该篇文章-Canvas-你应该会了(1) UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧! 阅读详情

       之前一篇我们主要了解实践了canvas的drawXXX方法,都是绘制一些很规矩的图形,例如圆形、矩形、直线、画点、画椭圆、绘制圆角矩形、绘制扇形、绘制弧线这些,大家也肯定发现了这些都是规规矩矩图形,那么如果要画一条折线,画一个三角形之类的自定义图形,该怎么办呢?这时候就改path出场了,对于canvas就是drawPath了。

       那么path是什么呢?听听Android怎么说:“The Path class encapsulates compound (multiple contour) geometric paths consisting of straight line segments, quadratic curves, and cubic curves. It can be drawn with canvas.drawPath(path, paint), either filled or stroked (based on the paint's Style), or it can be used for clipping or to draw text on a path.”大概翻一下大概是:Path类包含了由直线、二次曲线、三次曲线组成多种符合的集合路径图形,它可以用canvas.drawPath()来绘制,并且可以使填充的或者描边的(是基于paint的style的),并且它可以用于裁剪或者在一条path上面绘制文本。

        Path类的方法主要是addXXX和XXXTo方法:

  1.  addCircle(float x, float y, float radius, Direction dir):参数跟上一篇的drawCircle很类似,不过多了一个Direction参数,他的意思就是“The direction to wind the circle's contour”就是圆形绘制的方向,参数值有Path.Direction.CW和Path.Direction.CCW两种,前者是代表顺时针绘制,后者则是逆时针绘制。
  2. 除了addCircle之外还有addOval、addRect、addRoundRect这样的,但是无一例外跟canvas直接draw的相比都多了一个Direction参数,就是指绘制方向的,在绘制单个图形时候我们这个参数设置成逆时针与顺时针都没什么影响,在图形组合时候会有影响,后面再说。 
  3. lineTo(float x, float y):画直线,意思就是“Add a line from the last point to the specified point (x,y). If no moveTo() call has been made for this contour, the first point is automatically set to (0,0).”从上面点添加一条到特定点(x,y)的直线,如果moveTo方法没有被path调用,那么第一个点就自从从(0,0)开始。跟canvas的drawLine方法相比它只有一个坐标,因为它总是从上个绘制点往指定点绘制的,而不是像drawLine那样子需要两个坐标来确定一条直线,所以lineTo方法为一次性绘制多条连续的直线提供了方便。
  4. rLineTo(float dx, float dy):也是画直线,这算是lineTo的兄弟了,也是只有一对参数,确定一个坐标,但是它与lineTo的区别是,它的坐标的确定是依据于上个坐标点的坐标值的,也就是相对于上个坐标值的,不是一个绝对值,说起来比较抽象,我们来看一个例子,按照如下路径来绘制一条直线:(200, 200)→(250, 500)就是从200,200那个到250,500画一条直线,这些也都是相对于坐标系的绝对坐标,那么如果用rLineTo如何写呢?就这么写(200, 200)→(50, 300),发现了吧?就是在原来的坐标值累加或者减,就是rLineTo它的参数是相对值,是相对于上一个点要偏移的量,它不是一个绝对值,而lineTo就是一个绝对坐标。
  5. moveTo(float x, float y):“Set the beginning of the next contour to the point (x,y).”设置下一个path绘制的起点,其实也很好理解,默认绘制起点是坐标原点,但是不想从那里开始绘制怎么办?就可以调用这个方法,或者在绘制的过程中,突然不想从上一个点接着绘制了,想要从一个新的点开始绘制,调用这个方法也是 可以的。
  6. rMoveTo(float dx, float dy):它跟moveTo的关系就如同rLineTo和lineTo的关系了,所以意思就类比上面的就好了
  7. arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) :画弧形,这个跟canvas的drawArc相比少了一个userCenter参数,上篇我们说过该参数如果userCenter为true是绘制扇形,false是绘制圆弧,而现在该函数没有userCenter是因为该函数默认userCenter为false了,因为该函数只用来画圆弧,不画扇形,但是可以看到又多了一个forceMoveTo函数,它的意思是“If true, always begin a new contour with the arc”如果是true那么在话弧度时候就开始一个新的轮廓,啥意思呢?这么解释吧:好比我们刚绘制了一条直线,然后想绘制一段圆弧,那么这个圆弧跟刚刚的直线的末端是否要相连呢?这个时候就是用这个forceMoveTo来控制的了,如果为true,那么直线末端就不跟圆弧开始出相连,否则就是相连了
  8. addArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle):这个也是画圆弧的,那么跟上面的arcTo有什么区别呢?区别就在于它直接设了上面的 arcTo的forceMoveTo参数为true了,所以用它绘制圆弧,就不跟path前面绘制的图形有任何联系
  9. close():代表关闭了path绘制,啥意思呢?“Close the current contour. If the current point is not equal to the first point of the contour, a line segment is automatically added.”关闭当前的path绘制,如果当前结束点不是path开始绘制的七点,那么就会在起点和终点支架连接一条线段。举个例子,我们相用path绘制一个三角形,那咱么只需要绘制两条边就好了,然后调用close,那么第三条边就自动绘制上去了,但是有些情况比较特殊,不调用close方法图形也能闭环,好比我们paint设置style是填充模式,还是说绘制三角形,当绘制了两条边时候,两条边之间就已经被颜色填充了,所以就直接出现了三角形了,也自然不需要close来连接起点和终点构成三角形了
  10. setFillType(FillType ft):path的填充模式,这有个前提就是画笔要设置成是填充模式,它主要是用来设置图形相交时候的填充模式算法的,主要是四种模式,但是我们只说两种模式,因为后两种跟前两种是相反的,第一种EVEN_ODD奇偶原则,“对于平面中的任意一点,向任意方向射出一条射线(是射线不是直线哦,是有起点的,只是向一个方向无限延伸),这条射线和图形的相交次数(必须相交,不是相切)是奇数,则认为这个点在图形的内部,是需要涂色的区域,如果是偶数则认为不在此区域,那么是不需要涂色的区域”,然后是第二种WINDING非零环绕原则:“它需要你图形中的所有线条都是有方向的,然后同样的是在平面中的任意一点向任意方向发射出一条射线,但是规则不一样,以0为初始值,对于射线和图形的所有交点,遇到每个顺时针的交点(图形从射线的左边向右穿过)把结果加1,遇到每个逆时针的交点(图形从射线的右边向左穿过)把结果减1,最终把所有的交点都算上,得到的结果如果不是0,那么认为此点在图形内部,是需要被涂色的区域,如果是0,那么此点在图形外部,是不需要涂色的区域”,这里面用到了线条的方向,所以上面咱们说的Path.Direction就用上了。

       关于path的,就说这么多,如果不对之处欢迎批评指正。

       本文参考了 扔物线大神的一些博客文章,主要是写了自己对这些方法的一些理解。

        

Android开发自定义控件实现一个足球积分榜RankBar 为了实现一个如下图红色方框所示的控件,系统自带控件并不能满足要求,因此需要继承View重新画一个这样的控件 分析此控件发现分为3部分,中间的一列横线和左右两个标签 中间的部分好绘制,通过循环调用canvas的drawLine方法即可 然后分析左右两边的两个标签,因为左右两个是一样的,因此只分析左边的 外围形状是一个圆环被拉出来了一个三角形,这个三角形是等边三角形,等边三角形的上边顶点设 阅读详情

相关推荐

AI 算力基础设施深度系列(一):从容器到 Kubernetes——算力底座的诞生

1. 容器 = Namespace(视图隔离) + Cgroup(资源限制) + Union FS(镜像分层)└── 不是虚拟机!共享内核,接近零开销2. K8S 三大设计哲学:└── 声明式 API + 控制循环 + 可扩展架构3. K8S 架构:└── 控制面 (API Server / etcd / Scheduler / Controller Manager)

warm3snow的博客 534

Android Canvas之Path的详解与使用(二)

Path类封装复合(多轮廓)几何路径由直线段、二次曲线和三次曲线组成。它可以用画布绘制。drawPath(路径、绘制),填充或笔划(基于绘画的样式),或者可以用于剪裁或绘制路径上的文本。 Path属于路径,路径走多了就变成一种套路,只要我们会解套,那这种套路就是高速公路。路径走完形成闭环,最终形成一个图形。

2928

odoo19/18集成reportbro 打印插件 完美支持静默打印

ReportBro设计器 一个用于创建PDF和XLSX报告模板的javascript插件。ReportBro Designer可以轻松集成到您的Web应用程序中。每个人都可以设计和编辑文档模板,并直接在浏览器中预览它们。可以使用服务器上的 (有关完整的文档和演示,请参阅上的ReportBro项目网站。reportBro官方没有提供。测试环境:odoo17社区版。2.产品标签打印设计。

zxltwins的博客 2772

精通Android自定义View(十)绘制篇Canvas分析之绘制Path

1Path常用方法简析 Path在2D绘图中是一个很重要的类。 Path在这里可以绘制基本的图形,也可以绘制其他复杂的图形。 2 常用API解析与示例 2.1xxxTo方法 Path类中提供了一套xxxTo方法,其作用是从起点到终点移动path画笔并绘制线(moveTo方法只移动path画笔不绘制线),线有直线和曲线 方法汇总简述 方法名 参数解析 lineTo(...

代码小疯子 1654

Bybit面经

这段总结描述了求职者在Bybit面试过程中的经历和相关问题,包括面试内容、求职者向面试官提问的问题以及关于Bybit的信息

郑泽洲的博客 2580

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 762

Android绘图篇(三)——绘制Path路径及贝塞尔曲线

不废话,直

huxin1875的博客 7930

Anaconda+清华源加速PyTorch GPU环境安装与CUDA版本匹配指南

深度学习环境管理常面临依赖冲突与下载缓慢问题,通过虚拟环境隔离与镜像源加速可显著提升效率。Anaconda利用conda机制创建独立Python环境,避免包版本冲突;清华源通过国内镜像同步大幅提高下载速度。GPU版PyTorch安装需严格匹配CUDA、cuDNN与显卡驱动版本,否则易出现CUDA不可用错误。该方案适用于图像分割、目标检测等需多版本PyTorch并存的场景,能快速搭建稳定GPU训练环境。本文详解Anaconda安装、清华源配置及PyTorch GPU版安装全流程。

weixin_30522983的博客 235

Android drawPath的简单使用

Android drawPath的简单使用最近,有一个时钟屏保的需求,网上也有不少这方面的demo,但是有些方面还是不能满足我的需要。举个栗子,需要使我的时钟的时针和分针都是带箭头的,这样看起来更美观。那么问题来了,怎么才能画出一个带箭头的指针呢?通过查询AndroidAPI,我发现了drawPath方法——专门用来画多边形。好,我们先来画个多边形看看:Paint paint = new Paint

Androider_leavin的博客 5147

QEMU源码全解析 —— virtio(3)

QEMU源码全解析 —— virtio(3)

phmatthaus的专栏 1847

prometheus普罗米修斯集监控外部k8s

prometheus普罗米修斯集监控外部k8s

你是我一生的追求 2247

android drawpath填充,Android自定义View之Canvas的Path方法和Paint的DrawText的方法

本篇文章记录了一些觉得还是很有意思的一些方法,文章底部有自定义View的干货推荐哦!Canvas画路径初始化画笔工具mPaint.setColor(Color.RED);//设置画笔的颜色mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(4);//设置画笔宽度mPaint.setAntiAlias(true);画线(三角形)Path...

weixin_35833704的博客 1189

如何让 Mac mini 24小时不休眠运行 OpenClaw

如果 OpenClaw 每 5-10 分钟自动退出,launchd 连续 4 次快速重启后会判定为崩溃循环并卸载服务。:方案一(pmset)+ 方案三(launchd)组合使用,既防止系统休眠,又保证 OpenClaw 开机自启和崩溃自动恢复。:caffeinate 只在进程运行期间有效,终端关闭或进程结束后系统恢复正常睡眠策略。这条命令会自动创建 launchd plist 并启用服务,是最推荐的方式。替换为你的实际用户名路径,Node.js 路径也要改成你自己的。确保 plist 中有。

Maynor的博客 2202

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

在学习自定义view的时候,跟随https://hencoder.com/ui-1-1/的教程写写demo,遇到一个问题,需求是这样的,使用canvas的drawPath()方法绘制一个心形,如下图 需要绘制一个心形 ​​​ ​​​​​​ 教程给的代码是 public class PathView extends View { Paint paint = new Paint()...

Java_noob1的博客 4203

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android 画菱形

代码示例相关视频讲解:数组-Go代码演示Android 画菱形 在Android开发中,有时候我们需要绘制一些特殊形状的图案,比如菱形。本文将介绍如何使用Android的Canvas绘制一个菱形,并提供相关的代码示例。 Canvas 绘制菱形 在Android中,我们可以使用Canvas来绘制各种图形。要绘制一个菱形,我...

weixin_36845657的博客 191

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

java canvas 画三角形_Android开发之Canvas中利用Path绘制圆形、矩形、椭圆、三角形等基本图形的方法介绍...

这篇文章主要介绍了Android编程开发之在Canvas中利用Path绘制基本图形的方法,涉及Android基本的图形绘制技巧,结合实例分析了绘制圆形,矩形,椭圆,三角形等基本图形的实现方法,需要的朋友可以参考下在Android中绘制基本的集合图形,本程序就是自定义一个View组件,程序重写该View组件的onDraw(Canvase)方法,然后在该Canvas上绘制大量的基本的集合图形。直接上代...

weixin_42101237的博客 1224

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android自定义View Canvas 基本使用(一)

Android平常的开发中使用到Canvas的机会并不是太多,常规的开发中系统控件足够满足大部分要求,但是要是UI如果追求美观常用的系统控件就不能满足我们的要求了,所以诞生了自定义View 而自定义View中比较常见的是事件分发机制和View的绘制这两种 如果我们要自定义样式顾名思义肯定是要在View的onDraw()方法下对View进行绘制,绘制之前呢,自定义View还会进入到onMeasure()和onLayout方法里面 最后才进入onDraw方法绘制完成显示在界面上 onMeasure()测.

chengxuyuanchaochao的博客 471

Android中在屏幕上涂鸦的例子

在这个例子中自定义了一个View,可以接受touch动作,然后在屏幕上即时的显示出touch的轨迹,类似于线条的屏幕上涂鸦。这个例子主要是演示如何将onTouchEvent与draw配合起来使用。在这个基础上,可以做很多有用的程序。 import android.content.Context; import android.graphics.Canvas; import android.gra

comkingfly 1110

android绘制心形_android使用貝塞爾曲線自定義心形View

貝塞爾曲線(Bézier curve),又稱貝茲曲線或貝濟埃曲線,是應用於二維圖形應用程序的數學曲線。繪制心形需要Path類中的兩個方法分別是:moveTo(float x,float y) 貝塞爾曲線的起始位置,Add a cubic bezier from the last point, approaching control points (x1,y1) and (x2,y2), and e...

weixin_34668850的博客 377

android 斜线 绘制_Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形) ....

Class OverviewThe Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into the bitmap), a drawing...

weixin_39915721的博客 582

Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)...

1、首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, you need 4 basic components: A Bitmap to hold the pixels, a Canvas to host the draw calls (writing into...

weixin_30725467的博客 1582

android记账本折线图_Android自定义View - 仿支付宝月账单折线图

前言支付宝有个查看月账单的功能,最近一直在学习自定义View,于是就尝试着自己实现了一个类似的折线图。下面是支付宝消费分析功能截图和自己实现的折线效果截图:支付宝消费分析折线图.jpg效果1.jpg效果2.jpg效果3.jpg确定绘制内容在绘制折线图之前首先要分析折线图需要绘制哪些部分以及如何绘制这些部分,确定了各绘制部分及绘制方法之后再开始具体的绘制。支付宝消费分析折线图_v10.0.15.jp...

weixin_39961855的博客 591
上一篇: Android自定义view之基础canvas.drawXXX方法
下一篇: Android自定义view之paint.setShader()方法
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值