You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio中生成矢量图为何需指定尺寸?

为啥Android Studio里的矢量图还要指定尺寸?

嘿,这个问题问到点子上了!刚接触Android矢量图的时候,我也纳闷过——既然矢量图能无限缩放不糊,为啥还要在<vector>标签里写死width、height和viewport尺寸?这就给你拆解明白:

1. 先搞懂两个关键尺寸的区别

  • Viewport尺寸(android:viewportWidth/Height):这是矢量图的「设计坐标系」,相当于设计师画这个图标时用的画布大小。比如你写的viewportWidth="24.0",意思是这个图里所有路径的坐标都是基于24x24的网格来绘制的。它管的是矢量图形本身的比例,和最终显示大小无关——不管你把图标放大多少,这个坐标系保证路径不会变形走样。
  • 显示尺寸(android:width/Height):这是矢量图在Android布局里的「默认占位大小」,相当于给它一个初始的显示规格。你完全可以在布局里通过layout_width/layout_height或者scaleType来调整它的实际显示大小,而且不管怎么调,画质都不会损失。

2. 为啥这俩尺寸都不能少?

  • 没有viewport的话,Android根本不知道怎么解析矢量路径的比例。比如你画了一条从(0,0)到(24,24)的线,如果viewport是24,这条线就是对角线;但如果viewport是48,这条线就只占画布的一半,比例直接乱掉。
  • 没有width/height的话,这个矢量图在布局里就没有默认大小,会导致控件占位异常。比如你把它放到ImageView里,ImageView用wrap_content的话,就会默认用viewport的尺寸来计算(1viewport单位对应1dp),但提前指定width/height能让布局更可控,避免意外的显示问题。

3. 举个实际例子看效果

你生成的24x24矢量图代码:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12.5,7H11v6l5.25,3.15 0.75,-1.23 -4.5,-2.67z"/>
</vector>
  • 这里viewport的24.0保证了path的比例正确,不管你把width改成48dp还是12dp,图标都会按比例缩放,线条不会歪。
  • 而width/height的24dp是默认显示大小,你在布局里写android:layout_width="36dp",图标就会放大到36dp,依然清晰锐利。

4. 额外提醒:不用生成多套尺寸的矢量图

你之前说会生成两种尺寸的矢量图,其实这是没必要的!矢量图的优势就是一套图适配所有分辨率,不像传统的PNG图需要mdpi、hdpi等多套资源。只要有一套矢量图,就能在任何尺寸下清晰显示,省了不少资源打包的麻烦~

内容的提问来源于stack exchange,提问作者Cheok Yan Cheng

火山引擎 最新活动