0

0

Android vector fillType详解 XML中path的EvenOdd与NonZero区别

煙雲

煙雲

发布时间:2026-03-01 04:21:33

|

269人浏览过

|

来源于php中文网

原创

filltype="evenodd" 和 filltype="nonzero" 的填充区域取决于路径走向与射线交点的有向代数和(nonzero)或奇偶计数(evenodd),而非视觉形状;内环需反向绘制才能在 evenodd 下正确镂空。

android vector filltype详解 xml中path的evenodd与nonzero区别

fillType="evenOdd" 和 fillType="nonZero" 到底填哪块?

关键看 path 自身的走向和交叉逻辑,不是看形状“看起来”有没有洞——很多开发者画了个带内环的图标,设了 fillType="evenOdd" 却发现内环没被挖空,其实是路径方向写反了。

Android 的 fillType 控制的是「描边闭合后,像素点是否被判定为内部」的填充规则,底层用的是 Skia 的 winding rule。它不解析几何拓扑,只数路径段穿过某点的「有向次数」。

  • nonZero:从点引一条射线,统计所有与之相交的路径段的「方向代数和」;只要和 ≠ 0,就填充
  • evenOdd:同样引射线,只看交点总数是奇数还是偶数;奇数才填充

所以哪怕你画了两个完全重叠的圆形,方向相反,nonZero 下它们会互相抵消(净绕数为 0),结果不填;而 evenOdd 只数 2 个交点 → 偶数 → 也不填。但若只是嵌套、方向一致,nonZero 会填满整个外轮廓,evenOdd 才能挖空内环。

vector drawable 中 pathData 的方向怎么影响 fillType?

Android 不强制要求顺时针/逆时针,但 fillType 的行为高度依赖你手写的 pathData 走向。尤其是用工具导出 SVG 转 vector 时,常见问题就是内环被反向生成,导致 evenOdd 失效。

典型错误现象:android:pathData="M100,100 L200,100 L200,200 L100,200 Z M150,150 L180,150 L180,180 L150,180 Z" —— 两个矩形都是顺时针闭合,evenOdd 下内矩形不会被挖掉(因为交点数是偶数,但实际渲染仍实心);必须把内环改成逆时针,比如 M150,150 L150,180 L180,180 L180,150 Z,才能正确镂空。

造梦阁AI
造梦阁AI

AI小说推文一键成片,你的故事值得被看见

下载
  • 用 Android Studio 的 Vector Asset Studio 导入 SVG 时,默认启用「Optimize for vector drawables」,它会自动翻转内环方向适配 evenOdd
  • 手动写 pathData 时,建议用 nonZero + 统一顺时针方向,最稳;需要镂空再切到 evenOdd 并检查内环走向
  • Chrome DevTools 或 Inkscape 的「Path > Reverse Direction」可快速验证/修正方向

为什么有时 evenOdd 在低版本 Android 上表现异常?

Android 5.0(API 21)才正式支持 fillType 属性;5.0 之前该字段被直接忽略,默认按 nonZero 行为处理。更隐蔽的问题在 API 21–22:某些复杂自相交路径下,evenOdd 渲染结果与高版本不一致,比如一个「8」字形路径,部分设备上中间交叠区被误填。

  • 目标最低 SDK ≥ 23 时,evenOdd 行为基本可靠;低于 23 必须做兼容降级(例如拆成多个独立 group 或改用 bitmap fallback)
  • 避免在 evenOdd 路径中使用 c(三次贝塞尔)或 s(平滑贝塞尔)产生隐式自交,优先用直线段 + 圆弧组合
  • 真机测试比模拟器更准——部分模拟器对 Skia winding 实现有简化

fillType 对性能和内存有影响吗?

几乎没有。无论是 evenOdd 还是 nonZero,Skia 在光栅化阶段才做 winding 判定,且只对每个像素做一次射线投射(优化后实际是扫描线算法),开销远小于 path 解析或 shader 计算。

真正影响性能的是 pathData 复杂度:1000 个点的路径,无论什么 fillType,解析和缓存成本都一样高;而一个带 10 层嵌套环的简单路径,evenOdd 也比 10 条独立路径快得多。

  • 别为了“省性能”硬改 fillType;该镂空就用 evenOdd,该保实心就用 nonZero
  • 过度拆分 path(比如把一个图标拆成 20 个 path 元素)反而增加 XML 解析和绘制状态切换开销
  • VectorDrawable 的内存占用主要取决于 pathData 字符串长度和节点数,跟 fillType 无关

绕数规则本身很简单,难的是你画的路径到底怎么走——盯着 pathData 最后那个 Z 前的点序,比查文档管用。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1004

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

812

2023.11.06

chrome什么意思
chrome什么意思

chrome是浏览器的意思,由Google开发的网络浏览器,它在2008年首次发布,并迅速成为全球最受欢迎的浏览器之一。本专题为大家提供chrome相关的文章、下载、课程内容,供大家免费下载体验。

1004

2023.08.11

chrome无法加载插件怎么办
chrome无法加载插件怎么办

chrome无法加载插件可以通过检查插件是否已正确安装、禁用和启用插件、清除插件缓存、更新浏览器和插件、检查网络连接和尝试在隐身模式下加载插件方法解决。更多关于chrome相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

812

2023.11.06

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2113

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1142

2024.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

638

2023.08.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

6

2026.02.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 19.3万人学习

Java 教程
Java 教程

共578课时 | 74.1万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号