Android布局XML中的app:srcCompat和android:src之间的区别


138

每当我创建一个使用Android Studio的Vector Assets添加了带有图标的ImageView时,我都会收到一条错误消息 app:srcCompat="@drawable/ic_play"

当我更改app:srcCompatwith时android:src,错误消失了,但是图标看起来像是像素化的。

之间的主要区别是什么

app:srcCompat="@drawable/ic_play"

android:src="@drawable/ic_play"

Answers:


139

app:srcCompat

是将矢量可绘制对象集成到应用程序中的最简单的方法。矢量可绘制对象允许您用XML中定义的单个矢量图形替换多个png资产。虽然以前仅限于棒棒糖和更高版本的设备

注意

Android支持库23.3.0开始支持向量可绘制对象只能通过加载app:srcCompat

你需要添加vectorDrawables.useSupportLibrary =真到你的build.gradle文件

    // Gradle Plugin 2.0+  
 android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }  

android:src

设置一个可绘制对象作为此ImageView的内容,它将以其原始大小显示。没有自动缩放。


2
在Gradle应用程序模块中添加vectorDrawables.useSupportLibrary = true时,app:srcCompact的错误消失了
Zayid Mohammed

3
app:srcCompat是否会与旧的android版本冲突?更具体地说,Api 19是我所指的最旧的版本。
模棱两可的'17

哇终于可以摆脱位图图标了。
猫猫2012年

Google Plus发布链接现在已失效
Vadim Kotov,

我在上添加了build.gradle,但仍然无法正常工作,有什么想法吗?
大卫·卡兰南

20

如果使用的是android:src="@drawable/some_vector"没有vectorDrawables.useSupportLibrary = true在文件的build.gradle和您的应用程序具有矢量图像(矢量绘制),然后在构建APK文件的Android gradle这个插件生成了很多来自不同屏幕(华电国际,xhdpi ...)* .png文件每个矢量可绘制对象(仅适用于API = <19)。结果是-做大尺寸的apk

app:srcCompat="@drawable/some_vector"vectorDrawables.useSupportLibrary = trueandroid一起使用时,使用矢量可绘制文件而不生成*.png文件。

您可以使用Android Studio APK分析工具进行检查。只需使用和不使用即可构建apk vectorDrawables.useSupportLibrary = true

我认为这是主要区别。


因此,如果将useSupportLibrary设置为true,那么为什么需要特殊语法而不是android:src =?如果您在激活了useSupportLibrary的情况下使用android:src =,是否可以避免PNG的泛滥?
奥斯卡

9

用:

app:srcCompat="@drawable/backImage"

srcCompat属性实际上是在AppCompat库中定义的。重要提示:您将需要为此添加适当的名称空间。

xmlns:app="http://schemas.android.com/apk/res-auto"

注意

您得到的似乎只是可以忽略的皮棉错误。我尝试过并得到相同的错误,但它工作正常。

您可以使用tools:ignore="MissingPrefix"暂时避免出现此错误。

我希望这有帮助。


5

当使用AppCompat具有ImageView(或子类,如ImageButtonFloatingActionButton),你就可以使用新的app:srcCompat属性,以参考矢量绘图资源在旧版本的平台(以及任何其他绘制可用android:src

android.support.v7.appcompat.R.attr.srcCompat

srcCompat

设置一个drawable作为此ImageView的内容。在较旧版本的平台上运行时,允许使用矢量可绘制。

可以以形式引用另一个资源,也可以以形式"@[+][package:]type/name"表示主题属性"?[package:]type/name"


xmlns:app="http://schemas.android.com/apk/res-auto"使用时不要忘记添加app:srcCompat


4

向量和动画向量仅在框架的最新版本中受支持。srcCompat可以与兼容性库一起使用,以使其正常工作,但这仅适用于支持库中的某些视图。请注意,使用app:代替了android:。这意味着它不是框架的一部分,而是您的应用程序定义的参数。



3

当使用AppCompat具有ImageView(或子类,如ImageButtonFloatingActionButton),你就可以使用新的app:srcCompat属性,以参考矢量绘图资源(以及任何其他绘制可用android:src)。而且,如果您要在运行时更改可绘制对象,则可以使用与setImageResource()以前相同的方法(此处没有任何更改)。

使用AppCompatapp:srcCompat是将矢量可绘制对象集成到您的应用程序中最简单的方法。您会发现直接引用矢量可绘制对象在Lollipopapp:srcCompat之前将失败。


1

Android 5.0(API级别21)及更高版本提供了矢量可绘制支持,因此为了在较旧的版本中支持矢量可绘制app:添加了srcCompat

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.