理解Android的VectorDrawable属性

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>

默认情况下,宽度、高度、视口高度和视口宽度被设置为一些默认的Material设计值。
由于我们处理的是矢量图而不是像素图像。我的问题是:
  • 为什么需要设置大小(宽度、高度等)?
  • 如果我需要在多个尺寸上使用相同的矢量XML,则如何覆盖这个24dp的值,而不创建多个矢量XML,这当然违背了整个目的!

你找到了一种好的方法来在不同大小的地方使用相同的向量吗? - kirtan403
4个回答

5
在xml矢量图中添加@dimen会出错 错误:错误:宽度(0)和高度(0)不能<= 0

当引用维度资源而不是使用硬编码的dp值时,我也遇到了这个错误。是个bug吗? - Pam

4
矢量图形可用于以前使用png的地方。如果VectorDrawable没有宽度和高度,那么你将会创建一个全新的问题。如果在原始xml中没有定义VectorDrawable的大小,每次想要使用它时都必须确保其被定义。这将使得使用VectorDrawable与使用其他可绘制对象非常不同。例如,使用"wrap_content"将无法工作,因为你依赖于'content'来定义物体的大小。这意味着你不能像现在可以替换png一样简单地使用VectorDrawable,否则会导致应用程序的某些部分出现故障。如果你想让你的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"/>

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


0

viewportHeight和viewportWidth定义了图像的分辨率,而height和width则定义了在渲染时它将占用多少屏幕空间。

你需要知道的是:

如果你想在小区域(比如54x54)显示高质量的图像,那么你应该获取一个高质量的图像,比如380x380或512x512,然后将其宽度和高度设置为54x54,否则你的图像就不会有平滑的边角,也看起来不好。


0
XML 中定义的大小仅为可绘制对象的“固有”大小。您可以将其绘制为任何大小。如果您打算以多个尺寸绘制相同的矢量图形,则应为每个尺寸膨胀单独的 VectorDrawable 实例,并在每个实例上调用 setBounds(0,0,desiredWidth,desiredHeight)。您可能已经习惯了为许多用途调用 setBounds。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接