5

我需要帮助理解由 XML 定义的 VectorDrawable 的一些属性。

当我使用 Android Studio 导入新的矢量资产时,它会生成如下内容:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">

    <path 
        android:fillColor="#000000"
        android:pathData="M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z" />
</vector>

默认情况下,宽度、高度、viewportHeight 和 viewportWidth 被设置为一些默认的材料设计值。

因为我们处理的是矢量而不是像素图像。我的问题是:

  • 为什么需要设置尺寸(宽度、高度等)?
  • 如果我需要为多种尺寸使用相同的矢量 xml,如何在不创建多个矢量 xml 的情况下覆盖这个 24dp 值,这当然会破坏整个目的!
4

4 回答 4

5

在 xml 向量中添加 @dimen 会产生错误 Error:Error: Width (0) and height (0) cannot be <= 0

于 2016-04-14T16:35:34.917 回答
4

VectorDrawables 可用于您以前使用 png 的地方。如果 VectorDrawable 没有宽度和高度,您将创建一个全新的问题,如果您没有将 VectorDrawable 的大小定义为原始 xml 的一部分,那么您必须确保每次都定义它想用它。

这将使使用 VectorDrawable 与使用其他可绘制对象有很大不同,例如使用“wrap_content”将不起作用,因为您依靠“内容”来定义事物的大小。这意味着您不能像现在那样只用 VectorDrawable 替换 png,这会导致应用程序的某些部分损坏。

如果您想让您的 VectorDrawable 针对不同的设备配置具有不同的大小,您可以通过使用对资源的引用来定义它。

<vector ...
        android:width="@dimen/vector_size"
        android:height="@dimen/vector_size"
        .../>

然后在 res/values 中定义它:

<resources>
    <dimen name="vector_size">24dp</dimen>
</resources>

然后,您可以按照通常的方式将 vector_size 指定为不同设备配置的不同值。

如果您想在同一设备上使用具有多种尺寸的同一个 VectorDrawable,目前这有点困难,您最好创建多个版本。如果这样做,您可以考虑将 pathData 移动到字符串资源:

<path ...
    android:pathData="@string/vector_path_name"/>

这样,即使您有多个 VectorDrawable,它们都引用定义其形状的相同 pathData,如果您更改该字符串,您将更新所有版本。

于 2016-03-01T10:20:26.920 回答
0

viewportHeight 和 viewportWidth 定义图像的分辨率, height 和 width 定义渲染时在屏幕上占用的空间。

您只需要知道:

如果您想在 54x54 之类的小区域上显示高质量图像,那么您应该获得 380x380 或 512x512 之类的高质量图像,然后将其宽度和高度设置为 54x54,否则您的图像不会有平滑的边角并且看起来不好

于 2021-12-18T13:05:14.627 回答
0

XML 中定义的大小只是可绘制对象的“固有”大小。你可以画成任何你想要的大小。如果您打算以多种尺寸绘制相同的矢量,您应该为每种尺寸膨胀一个单独的 VectorDrawable 实例,并在每个尺寸上调用 setBounds(0,0,desiredWidth,desiredHeight)。您可能已经习惯于为许多用途调用 setBounds。

于 2017-12-13T20:26:36.953 回答