为什么我的矢量可绘制缩放不符合预期?

新手上路,请多包涵

我正在尝试在我的 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 元素的可绘制对象(即文本左侧的图标)现在会创建一个巨大的图标。

我的问题:

  1. 为什么矢量可绘制对象中有宽度/高度规范?我认为这些的全部意义在于它们无损地放大和缩小,使得宽度和高度在其定义中毫无意义?

  2. 是否可以使用单个矢量可绘制对象,它在 TextView 上用作 24dp 可绘制对象,但也可以很好地扩展以使用更大的图像?例如,我如何避免创建多个不同大小的矢量可绘制对象,而是使用一个可以缩放到我的渲染要求的对象?

  3. 如何有效地使用宽度/高度属性,与 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 许可协议

阅读 637
2 个回答

这里有关于这个问题的新信息:

https://code.google.com/p/android/issues/detail?id=202019

看起来使用 android:scaleType="fitXY" 会使其在 Lollipop 上正确缩放。

来自谷歌工程师:

嗨,让我知道 scaleType=‘fitXY’ 是否可以成为您的解决方法,以使图像看起来清晰。

棉花糖 Vs Lollipop 是由于在棉花糖中添加了特殊的缩放处理。

另外,对于您的评论:“正确的行为:vector drawable 应该在没有质量损失的情况下缩放。因此,如果我们想在我们的应用程序中使用 3 种不同尺寸的相同资产,我们不必复制 vector_drawable.xml 3 次不同的硬编码大小。”

尽管我完全同意应该是这样,但实际上,Android 平台存在性能问题,以至于我们还没有达到理想的世界。因此,如果您确定要同时在屏幕上绘制 3 个不同的尺寸,实际上建议使用 3 个不同的 vector_drawable.xml 以获得更好的性能。

技术细节基本上是我们在钩子下使用位图来缓存复杂的路径渲染,这样我们可以获得最佳的重绘性能,与重绘位图drawable相当。

原文由 Taehyun Park 发布,翻译遵循 CC BY-SA 3.0 许可协议

通过添加解决

defaultConfig {
    vectorDrawables.useSupportLibrary = true
}

到 build.gradle (module:app) 文件和 imageViews 替换

android:src="..."

app:srcCompat="..."

希望帮助

原文由 ahzare 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题