如何在程序中将VectorDrawable设置为ImageView的图像

71

我想在Android Studio中将一些VectorDrawables设置为ImageView

我可以轻松地设置png和jpg drawable,但是当我想设置VectorDrawable时,它在imageview上无法工作。

img.setImageResource(R.drawable.ic_home);

ic_home是VectorDrawable类型,但这段代码无法正常工作。


1
请阅读https://blog.stylingandroid.com/vectordrawables-part-1/中的内容。 - IntelliJ Amiya
我已经在这里回答了,希望能对你有所帮助。现在你可以更改矢量可绘制对象。https://dev59.com/AlsV5IYBdhLWcg3wyxV_#42281780 - vikas kumar
8个回答

148
如果您想使用矢量图像(小于或大于API 21),只需执行以下操作:
在程序中设置图像(例如,在您的活动中):
imageView.setImageResource(R.drawable.ic_left_arrow_blue); 

或通过XML:

app:srcCompat="@drawable/your_vector_name"

在你的应用程序的build.gradle文件中,你需要包含以下内容:

android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

如果需要在API 21以下的版本中支持向量图,请在onCreate中添加以下内容:

And for vector support for less than API 21, add the following to onCreate:

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);  

7
仍然无法在KitKat上运行,仅适用于>= 5.1版本,setImageResource可以正常工作。 - user924
2
对于KitKat这个版本,仅此才有效 https://dev59.com/DFsV5IYBdhLWcg3wrQkp#35918375 - user924
2
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true); 在Kitkat上解决了我的问题。 - Mohamed Nageh

26

对于那些想要通过编程方式加载矢量图形以进行其他用途的人,例如设置drawableLeft或其他用途,您可以使用以下方法:

Drawable drawable = AppCompatResources.getDrawable(context, drawableRes);

当上下文是 AppCompatActivity 时。


7
谢谢,我以前没见过这个 AppCompatResources 东西。随着每次 SDK 发布,混乱变得越来越严重。 - Pär Nils Amsen

18
根据官方安卓开发者博客,针对vectorDrawables,setImageResource()方法在运行时没有变化。

如果您需要在运行时更改可绘制对象,则可以像以前一样使用 setImageResource() 方法-没有变化。使用AppCompat和app:srcCompat是将矢量可绘制对象集成到应用程序中最可靠的方法。

如需了解更多详细信息,请查看Google Developer的这篇不错的文章“AppCompat-向量年代”

18

如果你关注向后兼容性,那么你应该使用AppCompatImageView而不是ImageView。请查看下面的代码。

<android.support.v7.widget.AppCompatImageView
    android:id="@+id/iv_about"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
   app:srcCompat="@drawable/ic_vector_image"
    />

Java

AppCompatImageView image = (AppCompatImageView) findViewById(R.id.iv_about);
image.setImageResource(R.drawable.ic_vector_image);

以下代码需要添加到build.gradle中:

android { defaultConfig{ vectorDrawables.useSupportLibrary = true } }

这将为app:srcCompat提供视角。


5
根据文档,"当您在布局中使用ImageView并且顶层活动/对话框由appcompat提供时,将自动使用它。仅在编写自定义视图时才需要手动使用此类。"因此,除非您要扩展它,否则只需使用ImageView即可。 - Adrian
@user924 我没有明确指出只要活动(activity)扩展了AppCompatActivity,你就可以使用ImageView。如果你的活动没有扩展AppCompatActivity,那就像你所说的那样。 - Adrian

3

如果要使用Java代码,可以这样做:

formate_img.setImageResource(R.drawable.ic_text);//ic_text is a Vector Image

对于 XML 的使用,请使用:

<android.support.v7.widget.AppCompatImageView
        android:id="@+id/search_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_weight="1"
        ads:srcCompat="@drawable/ic_barcode" //for Vector Image
        tools:ignore="VectorDrawableCompat" />

2

我在RecyclerView中使用了一个向量图像,我使用了img.setImageResource(R.drawable.ic_home),但它并没有像其他一些项目中的图像那样正常工作。然后我使用了img.setImageDrawable(activity.getResources().getDrawable(R.drawable.ic_home)),这个方法可以正常工作。


0
使用这个:
android.support.v7.widget.AppCompatImageButton, 
android.support.v7.widget.AppCompatImageView,
android.support.v7.widget.AppCompatTextView 

使用矢量类型图像,而不是 ImageButtonImageView 等。

主要用于自定义视图。


-4
从您的drawable文件夹中删除两个文件夹,然后重新构建项目,它将正常工作。enter image description here

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