172

每当我使用 Android Studio 的矢量资产创建带有添加图标的 ImageView 时,都会出现错误app:srcCompat="@drawable/ic_play"

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

之间的主要区别是什么

app:srcCompat="@drawable/ic_play"

android:src="@drawable/ic_play"
4

8 回答 8

162

应用程序:srcCompat

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

笔记

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

您需要将vectorDrawables.useSupportLibrary = true添加到您的build.gradle文件中

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

安卓:源代码

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

于 2016-11-16T05:24:05.317 回答
34

如果您在 build.gradle 文件中使用android:src="@drawable/some_vector"withoutvectorDrawables.useSupportLibrary = true并且您的应用程序有矢量图像(可绘制矢量),那么在构建apk文件时,Android gradle 插件会为不同的屏幕(hdpi、xhdpi ...)生成大量 *.png 文件您的每个矢量可绘制对象(仅适用于 API =< 19)。结果 - 更大的apk大小。

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

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

我认为这是主要的区别。

于 2018-07-28T21:54:54.053 回答
12

采用:

app:srcCompat="@drawable/backImage"

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

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

笔记

你得到的似乎只是一个可以忽略的 lint 错误。我已经尝试并得到了同样的错误,但它工作正常。

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

我希望这有帮助。

于 2016-11-16T05:26:38.593 回答
9

当使用AppCompatwith ImageView(或子类,如ImageButtonand FloatingActionButton)时,您将能够使用新app:srcCompat属性来引用旧版本平台上的矢量可绘制对象(以及任何其他可用于 的可绘制对象android:src

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

srcCompat

将可绘制对象设置为此 ImageView 的内容。在旧版本的平台上运行时允许使用矢量可绘制对象。

可能是对表单中另一个资源的引用,也可能是表单中"@[+][package:]type/name"的主题属性"?[package:]type/name"


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

于 2016-12-27T08:53:03.590 回答
7
app:srcCompat="some_resource" 

是指它是支持库中的 AppCompatActivity src,而

android:src="some_resource"

指简单的活动。

于 2016-11-16T05:22:04.890 回答
4

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

于 2016-11-16T05:21:06.550 回答
4

当使用AppCompatwith ImageView(或子类,如ImageButtonand FloatingActionButton)时,您将能够使用新app:srcCompat属性来引用矢量可绘制对象(以及任何其他可用于 的可绘制对象android:src)。如果您在运行时更改可绘制对象,您将能够使用与setImageResource()以前相同的方法(那里没有更改)。

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

于 2016-11-16T05:22:06.820 回答
2

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

于 2016-11-16T05:22:23.593 回答