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




