我试图在我的Android应用程序中使用矢量drawables . 从http://developer.android.com/training/material/drawables.html(强调我的):
在Android 5.0(API Level 21)及更高版本中,您可以定义矢量drawable,它可以在不丢失定义的情况下进行缩放 .
使用这个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年左右的移动设备上运行棒棒糖的高分辨率),会产生这种模糊的图像:
将矢量drawable的定义中的宽度和高度更改为200dp可显着改善400dp渲染大小的情况 . 但是,将此设置为TextView元素的drawable(即文本左侧的图标)现在会创建一个巨大的图标 .
我的问题:
1)为什么矢量可绘制中有宽度/高度规格?我认为这些问题的全部意义在于它们无损扩大和缩小,其宽度和高度在其定义中毫无意义?
2)是否可以使用单个矢量drawable,它在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资源 . 不会生成栅格化图像 .
7 回答
这里有关于此问题的新信息:
https://code.google.com/p/android/issues/detail?id=202019
看起来使用
android:scaleType="fitXY"
会使它在Lollipop上正确缩放 .来自Google工程师:
对于小于21的SDK版本,其中构建系统需要生成光栅图像,并且在未指定宽度/高度的情况下作为默认大小 .
如果您还需要针对少于21的SDK进行定位,我认为这是不可能的 .
Documentation:(现在我重读了它真的不太有用......)
More documentation:
Edit: 奇怪的事情正在发生 . 这是模拟器SDK版本23中的结果(Lollipop测试设备现在已经死了......):
在模拟器SDK版本21中:
AppCompat 23.2为所有运行Android 2.1及更高版本的设备引入了矢量绘图 . 无论vector drawable的XML文件中指定的宽度/高度如何,图像都能正确缩放 . 遗憾的是,此实现未在API级别21及更高版本中使用(有利于本机实现) .
好消息是我们可以强制AppCompat在API级别21和22上使用它的实现 . 坏消息是我们必须使用反射来执行此操作 .
首先,确保您使用的是最新版本的AppCompat,并且已启用新的矢量实现:
然后,在应用程序的onCreate()中调用
useCompatVectorIfNeeded();
:最后,确保使用
app:srcCompat
而不是android:src
来设置ImageView的图像:你的矢量drawables现在应该正确缩放!
1)为什么矢量可绘制中有宽度/高度规格?我认为这些问题的全部意义在于它们无损扩大和缩小,其宽度和高度在其定义中毫无意义?
2)是否可以使用单个矢量drawable,它在TextView上作为24dp可绘制,以及大的近屏宽度图像?
3)如何有效地使用width / height属性以及viewportWidth / Height的区别是什么?
我必须尝试这些方法但不幸的是,它们都没有奏效 . 我在
ImageView
中尝试fitXY
,我尝试使用app:srcCompat
但是甚至无法使用它 . 但我找到了一种技巧:但这种方式的重点是视图维度 . 如果您的
ImageView
尺寸不正确,则drawable会获得Stretch . 你必须在pre-lollipop版本中控制它或使用一些视图PercentRelativeLayout
.希望它有用 .
First :将svg导入drawble:((https://www.learn2crack.com/2016/02/android-studio-svg.html))
Second :如果你想得到Android API 7的支持,你必须使用Android支持库的编写((https://stackoverflow.com/a/44713221/1140304))
1-添加
到您的build.gradle文件 .
2 - 在布局中使用具有imageView的命名空间:
Third :用android设置imageView:scaleType = "fitXY"并使用app:srcCompat
Fourth :如果你想在java代码中设置svg你必须在oncreate methoed上添加以下行
我只是改变矢量图像的大小来解决我的问题 . 从第一个开始,资源就像:
我已将其更改为150dp(使用此向量资源布局的ImageView大小),如:
它对我有用 .