在Android布局XML中,app:srcCompat和android:src有什么区别?

187
每当我使用Android Studio的矢量资源创建带有图标的ImageView时,我在app:srcCompat="@drawable/ic_play"这一行遇到了错误。
如果我将app:srcCompat更改为android:src,则错误消失了,但图标看起来很模糊。
主要区别是什么?
app:srcCompat="@drawable/ic_play"

android:src="@drawable/ic_play"
6个回答

174

app:srcCompat

是将 矢量图形 集成到应用程序中最简单可靠的方法。矢量图形允许您使用 XML 中定义的单个矢量图形替换多个 PNG 资源,而之前只能在 Lollipop 及更高版本的设备上使用。

注意

Android Support Library 23.3.0起,支持矢量图形只能通过 app:srcCompat 加载。

您需要在 build.gradle 文件中添加 vectorDrawables.useSupportLibrary = true

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

android:src

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


3
在Gradle应用程序模块中添加vectorDrawables.useSupportLibrary = true后,app:srcCompact的错误就消失了。 - Zayid Mohammed
4
app:srcCompat属性会与较旧版本的Android系统产生冲突吗?具体而言,我指的是最老的API 19版本。 - Equivocal
哇,终于可以摆脱位图图标了。 - Meow Cat 2012
1
Google Plus的帖子链接现在已经失效。 - Vadim Kotov
1
我已经在 build.gradle 中添加了上述内容,但还是没有生效,有什么想法吗? - David Callanan
1
谢谢,我尝试了几周才明白如何停止Gradle生成这些PNG文件。 - Maksim Novikov

38
如果您在build.gradle文件中没有使用vectorDrawables.useSupportLibrary = true,并且您的应用程序具有矢量图像,则在构建apk文件时,Android gradle插件会从每个矢量可绘制对象生成许多不同屏幕(hdpi、xhdpi等)的*.png文件(仅适用于API<=19),导致apk文件变得更大。
当使用vectorDrawables.useSupportLibrary = trueapp:srcCompat="@drawable/some_vector"一起使用时,Android将使用矢量可绘制文件而无需生成* .png文件。
您可以使用Android Studio APK分析器工具检查此内容。只是先构建带有vectorDrawables.useSupportLibrary = true和不带有这个参数的APK文件,来比较两者的区别。
我认为这是主要的区别。

6
如果你将useSupportLibrary设置为true,那么为什么需要特殊的语法而不是android:src =?如果在激活useSupportLibrary的情况下使用android:src =,是否可以避免PNG文件的扩散? - Oscar

12

使用:

app:srcCompat="@drawable/backImage"

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

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

注意

您所遇到的似乎只是一个可以忽略的代码检查错误。我已经尝试并得到了同样的错误,但它实际上是正常工作的。

您可以使用tools:ignore="MissingPrefix"来暂时避免看到这个错误。

希望这可以帮到您。


7
app:srcCompat="some_resource" 

"is refer" 意为“被引用”,它是在支持库中提供的 AppCompatActivity src。

android:src="some_resource"

指的是简单的活动。


这很有见地。 - Sumit

4

矢量图和动态矢量图仅在最近的框架版本中得到支持。可以使用兼容库中的srcCompat使它们正常工作,但这仅适用于支持库中的某些视图。请注意,使用的是app:而不是android:。这意味着它不是框架的一部分,而是由您的应用程序定义的参数。


3

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


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