Android Vector(矢量图)介绍

news2024/11/22 13:34:01

Android Vector(矢量图)介绍

1、vector的宽高属性

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
	...
</vector>
  • 上面的 viewportWidthviewportHeight 可以理解为画布的宽高,而 widthheight 则可以理解为实际的大小,这样的好处就是一切按照比例进行绘制
  • 例如:当 viewportWidth 为24,width为48dp时(即1:2),如果指定线的长度为3,那么实际绘制时对应的长度就是 6dp
  • 上面的xml中,如果我们将 android:width 和 android:height 改为 48dp,那么就相当于我们对我们的图放大了一倍
  • 一般情况下都是设定为 1:1 的比例,这样比较方便理解和计算

2、pathData

  • vector 里最重要的内容就是 pathData了,pathData 就是真正的绘制代码
  • pathData 中主要有几种类型,M表示移动到某个点,L表示画线,A表示弧线,Q是二阶贝塞尔,C是三阶贝塞尔,Z表示闭合,V表示垂直,H表示水平
  • 注意以上 字母大写时表示绝对坐标,小写则表示相对坐标,除了Z不需要参数外,其余字母都有对应的参数要设置
  • V 和 H 可以说是 L 的一种便捷方式,因此 V 和 H 不是必须的。
  • 坐标系是以左上角为原点,向下为y轴正方向,向右为x轴正方向

基本语法:

  • M:move to 移动绘制点,作用相当于把画笔落在哪一点。

  • L:line to 直线,就是一条直线,注意,只是直线,直线是没有宽度的,所以你什么也看不到

    android:strokeColor="#333330" android:strokeWidth="10" 设置颜色和宽度0
    
  • Z:close 闭合,就是把图封闭起来。

  • C:cubic bezier 三次贝塞尔曲线

  • Q:quatratic bezier 二次贝塞尔曲线

  • A:ellipse 圆弧

每个命令都有大小写形式,大写代表后面的参数是绝对坐标,小写表示相对坐标,相对于上一个点的位置,参数之间用空格或逗号隔开。

命令详解:

  • M(x y) 把画笔移动到x,y,要准备再这个地方画圆了。

  • L(x y) 直线连接到x,y ,还有简化命令 H(x) 水平连接,V(y) 垂直连接。

  • Z,没有参数,连接起点和终点。

  • C(x1 y1 x2 y2 x y),控制点(x1,y1) (x2,y2) ,终点 x,y。

  • Q(x1 y1 x y),控制点(x1,y1),终点 x,y。

  • A(rx ry x-axis-rotation large-arc-flag sweep-flag x y)

    • android:pathDat="M50,50 a10,10 1,1 0 1,0"
      
    • rx ry 椭圆半径

    • r-axis-rotation x轴旋转角度

    • large-arc-flag 为0时表示取小弧,1时取大弧(舍取的时候,是要长的还是短的)

    • sweep-flag 0取逆时针方向,1取顺时针方向

3、绘制类型

3.1、移动类型

  • M(x,y)
  • 要绘制任何图形首先得有个起点,这个可以用M来表示,参数是坐标
  • M表示移动到某个点的意思

3.2、直线

  • L(x,y)

  • 绘制直线比较简单,用字母L表示,当绘制水平线时可以用H,绘制垂直线时可以用V

  • 注意 strokeWidthstrokeColor 必须指定才能看到绘制的线,否则是看不到的,而且 strokeWidth的范围相当于 viewportWidth 来说的,也就是不能用单位 dp来表达,当我们指定 viewportWidth 为 1时,由于1占了24的二十四分之一,因此我们会发现显示出来的效果就是线太粗了

  • L后面主要跟两个参数,就是要绘制的直线的终点坐标,实际上起点坐标都是以上一个点作为起点目标

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
        <path
            android:pathData="
            M0,0
            L24,24
            H0
            V0
            H24
            V24
            M0,24
            L24,0
            M0,12
            H24
            M12,0
            V24
            M0,6
            H24
            M0,18
            H24
            M6,0
            V24
            M18,0
            V24
            "
            android:strokeWidth="0.05"
            android:strokeColor="@android:color/black" />
    </vector>
    
  • 上面代码效果为:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sk06uBFe-1689323854944)(D:\Document\Typore-pics\image-20230713180453650.png)]

3.3、弧线

  • 格式为:A(rx ry x-axis-rotation large-arc-flag sweep-flag x y)

    • 中文注释:A(x轴半径,y轴半径 x轴旋转角度 大小弧 顺逆时针 终点坐标)
  • 参数说明:

    • 绘制弧线一般会有弧线的起点和终点,起点不用说,就是上一个点的位置,那么终点就是A最后的x和y
    • A中的前两个就是指定的半径
    • 至于 x-axis-rotation 表示x轴的旋转角度,取0和1发现效果一致
    • large-arc-flag就是指明要大弧还是小弧,1表示要大弧,0表示小弧
    • sweep-flag是说按顺时针还是逆时针,0取逆时针,1取顺时针
  • 曲线绘制实例

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
        <path
            android:pathData="
            M0,0 L24,24 H0 V0  H24 V24 M0,24 L24,0
            M0,12 H24
            M12,0 V24
            M0,6 H24
            M0,18 H24
            M6,0 V24
            M18,0 V24
            "
            android:strokeWidth="0.05"
            android:strokeColor="@android:color/black" />
        <!--顺时针大弧-->
        <path
            android:pathData="
            M12,6
            A6,6 0 1 1 6,12
            "
            android:strokeWidth="0.5"
            android:strokeColor="@color/lawn_green" />
        <!--顺时针小弧-->
        <path
            android:pathData="
            M12,6
            A6,6 0 0 1 6,12
            "
            android:strokeWidth="0.5"
            android:strokeColor="@color/deep_blue" />
        <!--逆时针小弧-->
        <path
            android:pathData="
            M12,6
            A6,6 0 0 0 6,12
            "
            android:strokeWidth="0.5"
            android:strokeColor="@color/coral_red" />
        <!--逆时针大弧-->
        <path
            android:pathData="
            M12,6
            A6,6 0 1 0 6,12
            "
            android:strokeWidth="0.5"
            android:strokeColor="@color/lawn_green" />
    
    </vector>
    
  • 绘制效果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sJT2btqC-1689323854945)(D:\Document\Typore-pics\image-20230714091127868.png)]

  • 此时,如果需要绘制一个圆,圆其实就是两个半弧组成,因此只要绘制两个半弧就可以了

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
        <path
            android:pathData="
            M0,0 L24,24 H0 V0  H24 V24 M0,24 L24,0
            M0,12 H24
            M12,0 V24
            M0,6 H24
            M0,18 H24
            M6,0 V24
            M18,0 V24
            "
            android:strokeWidth="0.05"
            android:strokeColor="@android:color/black" />
        <path
            android:pathData="M18,12
            A6,6 0 1 0 6,12
            A6,6 0 1 0 18,12"
            android:strokeWidth="0.5"
            android:strokeColor="@color/deep_blue"/>
    
    </vector>
    
  • 效果为:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLlWjDxM-1689323854945)(D:\Document\Typore-pics\image-20230714092434099.png)]

  • 其中 A6,6 0 1 0 6,12 绘制上半段弧,A6,6 0 1 0 18,12 绘制下半段弧,注意下面的A是以上一个A的终点作为起点的。

3.4、贝塞尔曲线

二阶

https://img-blog.csdnimg.cn/20200726144613681.png

  • 假设从a(Xa,Xb)点到b(Xb,Yb)点的二阶贝塞尔(只有一个控制点),可以直接设置控制点c(Xc,Yc),那么写法就是 QXc,Yc Xb,Yb 例如 :Q1,1 2,2

  • 再具体点,以绘制一个聊天背景框为例,这里我们设定我们画布的大小为20*10,那么接下来的坐标我们都需要再这个x属于[0,20],y属于[0,10]这个范围内,然后聊天对话框的边角是圆角,圆角本来也可以用椭圆A来绘制,但此处我们使用二阶贝塞尔Q来实现

  • 整个绘制分为两个部分,一部分是绘制圆角矩形,一部分是绘制底下的三角形

  • 绘制圆角矩形的话,我们先用M移动到我们需要绘制的第一个圆角的位置即左上角,作为贝塞尔曲线的起始点,然后按逆时针方向依次绘制圆角,向下竖线,圆角,向右横线,圆角,向上竖线,圆角,这样一个圆角矩形就绘制完成了

  • 实例代码:

    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="20dp"
        android:height="10dp"
        android:tint="#417FF9"
        android:viewportWidth="20"
        android:viewportHeight="10">
    
        <path
    
            android:fillColor="@android:color/white"
            android:pathData="
            M1,0
            Q0,0 0,1
            V8
            Q0,9 1,9
            L19,9
            Q20,9 20,8
            V1
            Q20,0 19,0
    
            M9.5,9
            H10.5
            L10,10
    
            z" />
    </vector>
    
  • 效果图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ymL65mFX-1689323854946)(D:\Document\Typore-pics\image-20230714100934490.png)]

三阶

https://img-blog.csdnimg.cn/20200726144840996.png

  • 三阶贝塞尔曲线用大写C或小写c表示,后面跟三个坐标点的坐标,分别是控制点1,控制点2,控制点3,和终点坐标,坐标中间用空格隔开
  • 假设要绘制从a(Xa,Ya)点到b(Xb,Yb)点的三阶贝塞尔(有两个控制点),可以设置控制点坐标c(Xc,Yc)和d(Xd,Yd),那么写法就是CXc,Yc Xd,Yd Xb,Yb,例如:C0,0 1,1 2,2
  • 但是此时起始点a的坐标没有体现出来,因为起始点就是从上一个点开始的,比如你可以通过M移动到某个点e或者通过L达到点e,接着再绘制贝塞尔,那么这个e点就是贝塞尔曲线的起始点

参考:

  • Android vector标签 PathData 画图超详解 - 夜の魅 - 博客园
  • (12条消息)Android vector矢量图-画圆详解_qq_35323561的博客-CSDN博客_android vector画圆

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/753006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

控制台警告:alue of key ‘route.角色管理‘ is not a string!

控制台警告&#xff1a;Value of key route.角色管理 is not a string! 具体情况如下图所示&#xff1a; 解决办法&#xff1a; 先找到要修改的配置文件&#xff0c;先在src文件下&#xff0c;locale文件中找index.js。 如果src下没有locale文件可以找lang文件下的index.js文…

DAY46:动态规划(八)01背包应用2:一和零(二维容量01背包)

文章目录 474.一和零思路为什么不是多重背包而是01背包与之前01背包问题的区别 DP数组的含义递推公式&#xff08;也是求最大值&#xff09;初始化遍历顺序完整版总结 474.一和零 本题属于 装满背包最多能有多少个物品 类型本题是容量有两个维度的背包&#xff0c;背包容量是m…

【数据结构】树与二叉树(上)

目录 前言&#xff1a; 一、树&#xff1a; 1.树的概念&#xff1a; 2.树的相关概念&#xff1a; 3.树的表示&#xff1a; 4.书的实际使用场景&#xff1a; 二、二叉树&#xff1a; 1.二叉树的概念&#xff1a; 2.两种特殊二叉树&#xff1a; ①.满二叉树&#xff1a;…

力扣每日一题2023.7.13

题目: 示例: 分析: 给我们一个矩阵,我们需要找出一条路径从矩阵第一层(索引为0)到达矩阵最后一层,并且使得路径上的数值之和最小. 如果是老手,那么应该一眼就能看出来可以使用动态规划,如果看不出来,那我们接下来一起分析分析. 首先我们先不要搞这么复杂,以示例1为例,我们就…

Redis数据结构 — QuickList

目录 quicklist 结构设计 总结 quicklist 结构设计 quicklistNode 结构体里包含了前一个节点和下一个节点指针&#xff0c;这样每个 quicklistNode 形成了一个双向链表。但是链表节点的元素不再是单纯保存元素值&#xff0c;而是保存了一个压缩列表&#xff0c;所以 quickli…

JSP基础

javaWeb项目目录 src&#xff1a;存放Java源文件 src/main/java/com&#xff1a;存放相应的Java代码&#xff0c;并根据对应的Java项目继续分层架构&#xff0c;主要有以下几个软件包。 bean包&#xff1a;封装类&#xff0c;一般是按照数据库的来写内容的&#xff0c;一个表…

Sentry 监控部署与使用(详细流程)

一、简介 Sentry 是一个开源的实时错误监控的项目&#xff0c;它支持很多端的配置&#xff0c;包括 web 前端、服务器端、移动端、游戏端。 基于 Django 构建的现代化的实时事件日志监控、记录和聚合平台&#xff0c;主要用于如何快速的发现故障。更快地解决错误和性能问题&…

vue——自定义指令,实现拖拽改变元素的宽度——技能提升

最近在看企业微信时&#xff0c;发现tapd的需求部分&#xff0c;分为左右两部分&#xff0c;左侧可以实现拖拽改变宽度。 感觉这样的实现效果比较好&#xff0c;再联想到之前写绩效结构时&#xff0c;也是同样的左右布局。 如果能实现同样的效果&#xff0c;则算是很好一种体…

【方法】公众号上传的视频不能横屏播放,如何解决?

目录 说明 解决步骤 步骤一&#xff1a;开启微信横屏模式 步骤二&#xff1a;打开手机自动旋转功能 说明 直接用手机打开公众号文章上内嵌的视频&#xff0c;发现只能横屏播放&#xff0c;无法全屏查看。 这个时候学习&#xff0c;尤其是看视频课程的时候无法看清楚全图。…

华为发布大模型时代AI存储新品

7月14日&#xff0c;华为发布大模型时代AI存储新品&#xff0c;为基础模型训练、行业模型训练&#xff0c;细分场景模型训练推理提供存储最优解&#xff0c;释放AI新动能。 企业在开发及实施大模型应用过程中&#xff0c;面临四大挑战&#xff1a; 首先&#xff0c;数据准备时…

数据结构:第五章 树

文章目录 一、树的基本概念1.1树的定义1.2树的基本用语1.2.1结点之间的关系描述1.2.2结点、树的属性描述1.2.3有序树、无序树1.2.4森林1.2.5小结 1.3树的性质 二、二叉树的概念2.1二叉树的定义和基本术语2.2二叉树的性质2.2.1二叉树常考性质2.2.2完全二叉树常考性质 2.3二叉树的…

使用chatgpt过funcaptcha验证码3个人学习记录

funcaptcha 验证码3 通过记录 往期验证码&#xff1a;http://t.csdn.cn/ulgXY funcaptcha1 往期验证码&#xff1a;http://t.csdn.cn/3xMnZ funcaptcha2 funcaptcha 那个公司开发的简要介绍&#xff1a; Funcaptcha是由hCaptcha公司开发的一种人机验证系统。hCaptcha是一家位…

快速排序的非递归实现、归并排序的递归和非递归实现、基数排序、排序算法的时间复杂度

文章目录 快速排序的非递归三数取中法选取key快速排序三路划分 归并排序的递归归并排序的非递归计数排序稳定性排序算法的时间复杂度 快速排序的非递归 我们使用一个栈来模拟函数的递归过程&#xff0c;这里就是在利用栈分区间。把一个区间分为 [left,keyi-1][key][keyi1,right…

机器学习(13)--支持向量机

目录 一、支持向量机概述 二、Sklearn中的SVM概述 三、线性SVM损失函数 四、sklearn中进行可视化 1、导入模块 2、实例化数据集&#xff0c;可视化 3、网格点制作 4、建立模型并绘制决策边界和超平面 5、常用接口 6、如果数据是环形呢&#xff1f; 五、核函数 1、…

emacs下相对行号的设置

全局设置 全局开启行号显示&#xff1a;global-display-line-numbers-mode t 并设置 display-line-numbers-type的样式: relative 相对 配置代码如下: (use-package emacs:ensure t:config (setq display-line-numbers-type relative) (global-display-line-numbers-mode t)…

校园跑腿小程序如何运营赚钱,方法其实很简单

校园跑腿小程序是一种以满足大学生的校园内外需求为主要目标的创业方式。下面将详细介绍校园跑腿小程序的运营方式&#xff0c;包括市场调研、产品设计、用户获取与留存、服务流程管理等方面。 市场调研&#xff1a; 在开始校园跑腿小程序的运营之前&#xff0c;进行充分的市…

2023年经典【自动化面试题】附答案

一、请描述一下自动化测试流程&#xff1f; 自动化测试流程一般可以分为以下七步&#xff1a; 编写自动化测试计划&#xff1b; 设计自动化测试用例&#xff1b; 编写自动化测试框架和脚本&#xff1b; 调试并维护脚本&#xff1b; 无人值守测试&#xff1b; 后期脚本维…

【C++从0到王者】第九站:String基本介绍及使用

文章目录 一、String的基本使用二、String构造相关的成员函数1.String构造函数2.String析构函数3.operator运算符重载4.String增删查改之增5. operator[]运算符重载 三、String迭代器1.迭代器介绍2.string中迭代器的作用3.迭代器跟容器结合4.反向迭代器5.const修饰的迭代器 四、…

华夏ERP在虚拟机Ubuntu上的安装(测试实例)

1.虚拟机软件VirtualBOX 7.0 2.Ubuntu 版本 3.宝塔面板安装 百度搜索宝塔面板&#xff0c;按官网提示进行安装。下面截图是官网示例。 if [ -f /usr/bin/curl ];then curl -sSO download.cnnbt.net/install_panel.sh;else wget -O install_panel.sh download.cnnbt.net/install…

python接口自动化(三十七)-封装与调用--读取excel 数据(详解)

简介 在进行软件接口测试或设计自动化测试框架时&#xff0c;一个不比可避免的过程就是: 参数化&#xff0c;在利用python进行自动化测试开发时&#xff0c;通常会使用excel来做数据管理&#xff0c;利用xlrd、xlwt开源包来读写excel。例如&#xff1a;当我们登录的账号有多个的…