我正在尝试在我的 Android 应用程序中使用矢量绘图。来自 http://developer.android.com/training/material/drawables.html (强调我的):
在 Android 5.0(API 级别 21)及更高版本中,您可以定义矢量可绘制对象, 它可以缩放而不会丢失定义。
使用这个drawable:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
和这个 ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
尝试以 400dp 显示图标时会产生此模糊图像(在 2015 年左右运行棒棒糖的较大高分辨率移动设备上):
将可绘制矢量定义中的宽度和高度更改为 200dp 可显着改善 400dp 渲染大小的情况。但是,将其设置为 TextView 元素的可绘制对象(即文本左侧的图标)现在会创建一个巨大的图标。
我的问题:
为什么矢量可绘制对象中有宽度/高度规范?我认为这些的全部意义在于它们无损地放大和缩小,使得宽度和高度在其定义中毫无意义?
是否可以使用单个矢量可绘制对象,它在 TextView 上用作 24dp 可绘制对象,但也可以很好地扩展以使用更大的图像?例如,我如何避免创建多个不同大小的矢量可绘制对象,而是使用一个可以缩放到我的渲染要求的对象?
如何有效地使用宽度/高度属性,与 viewportWidth/Height 有什么区别?
额外细节:
- 设备正在运行 API 22
- 将 Android Studio v1.5.1 与 Gradle 版本 1.5.0 一起使用
- 清单是编译和目标级别 23,最低级别 15。我也尝试将最低级别移动到 21,但这没有任何区别。
- 反编译 APK(最低级别设置为 21)会在可绘制文件夹中显示单个 XML 资源。不产生光栅化图像。
原文由 Chris Knight 发布,翻译遵循 CC BY-SA 4.0 许可协议
这里有关于这个问题的新信息:
https://code.google.com/p/android/issues/detail?id=202019
看起来使用
android:scaleType="fitXY"
会使其在 Lollipop 上正确缩放。来自谷歌工程师: