我正在尝试在Android应用程序中使用矢量可绘制对象。从http://developer.android.com/training/material/drawables.html(重点是我):
在Android 5.0(API级别21)及更高版本中,您可以定义矢量可绘制对象,这些对象可缩放而不会丢失定义。
使用此可绘制对象:
<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)如何有效使用width / height属性,以及viewportWidth / Height有何区别?
额外细节:
- 设备正在运行API 22
- 将Android Studio v1.5.1与Gradle版本1.5.0一起使用
- 清单是编译级别,目标级别是23,最低级别是15。我也尝试过将最低级别提高到21,但这没什么区别。
- 反编译APK(最低级别设置为21)会在drawable文件夹中显示单个XML资源。没有产生光栅图像。
drawable
文件夹。矢量可绘制xml文件中的宽度/高度为24dp。指定高/宽为400dp的ImageView肯定会造成缩放比例差的图像。
drawable-anydpi-v21
是我的minSdkVersion
年龄小于21。如果将设置minSdkVersion
为小于21 ,行为会有任何变化吗?将XML迁移到drawable-anydpi
哪里呢?我不希望有任何变化,但我也希望您的矢量图像能够正确缩放...
drawable-anydpi-v21
其中包含mdi / hdpi / etc中的各种光栅化图像。文件夹。不过,最终渲染结果没有变化。
New -> Vector Asset
它时,将矢量图像XML放入我的drawable文件夹中。但是,如果我使用apktool解压缩生成的APK,我会发现XML文件已经存在drawable-anydpi-v21
并且可以在API 21+设备上正确缩放。栅格文件放置在drawable-<mdpi/hdpi/etc>-v4
文件夹中,并且未在API 21+设备上使用(基于它们可以正确缩放的事实)