如何以编程方式将 VectorDrawable 设置为 ImageView 的图像

Posted

技术标签:

【中文标题】如何以编程方式将 VectorDrawable 设置为 ImageView 的图像【英文标题】:How to set VectorDrawable as an image for ImageView programmatically 【发布时间】:2017-04-27 03:38:04 【问题描述】:

我想在 android Studio 中将一些 vectorDrawables 设置为 ImageView

我可以轻松设置 png 和 jpg drawable,但是当我想设置 VectorDrawable 时,它​​不适用于 imageview。

img.setImageResource(R.drawable.ic_home);

ic_home 是 VectorDrawable,此代码不起作用。

【问题讨论】:

阅读blog.stylingandroid.com/vectordrawables-part-1 我已经在这里回答了,希望对您有所帮助。您现在可以更改矢量可绘制对象。 ***.com/a/42281780/4517450 【参考方案1】:

根据官方android developer blog,vectorDrawables 在运行时的 setImageResource() 方法没有变化。

如果您在运行时更改可绘制对象,您将能够使用 相同的 setImageResource() 方法和以前一样 - 那里没有变化。使用 AppCompat 和 app:srcCompat 是将矢量绘图集成到您的最简单的方法 应用程序。

有关更多详细信息,请查看 Google Developer 撰写的这篇精彩文章 AppCompat — Age of the vectors。

【讨论】:

【参考方案2】:

如果您担心向后兼容性,那么您应该使用AppCompatImageView 而不是图像视图。浏览下面的代码。

<android.support.v7.widget.AppCompatImageView
    android:id="@+id/iv_about"
    android:layout_
    android:layout_
    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 的视角。

【讨论】:

不需要,根据文档“这将在您在布局中使用 ImageView 时自动使用,并且***活动/对话框由 appcompat 提供。您应该只需要手动使用编写自定义视图时的此类。”所以除非你扩展它,否则你可以只使用 ImageView。 @user924 我没有指定只要Activity扩展了AppCompatActivity就可以使用ImageView。如果你没有,就像你说的那样。【参考方案3】:

如果您想使用矢量可绘制对象(小于或大于 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

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);  

【讨论】:

仍然不适用于 KitKat,仅适用于 >= 5.1 它适用于 setImageResource 对于 KitKat 这仅适用于 ***.com/a/35918375/7767664 AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);解决了我在 Kitkat 上的问题【参考方案4】:

我在回收站视图中有一个矢量,我正在使用img.setImageResource(R.drawable.ic_home),它无法正常工作,就像在回收站视图的某些项目中形成的其他图像一样。然后我用了img.setImageDrawable(activity.getResources().getDrawable(R.drawable.ic_home)) 这个工作。

【讨论】:

【参考方案5】:

使用这个:

android.support.v7.widget.AppCompatImageButton, 
android.support.v7.widget.AppCompatImageView,
android.support.v7.widget.AppCompatTextView 

而不是ImageButtonImageView 等。

如果使用矢量类型的图像。主要用于自定义视图。

【讨论】:

【参考方案6】:

对于那些想要以编程方式加载矢量可绘制对象以用于其他用途的人,例如设置 drawableLeft 或其他方式,您可以使用:

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

上下文是 AppCompatActivity。

【讨论】:

谢谢,我以前没见过这个 AppCompatResources 的东西。每个 SDK 版本都会使情况变得更糟。【参考方案7】:

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_
        android:layout_
        android:layout_marginTop="20dp"
        android:layout_weight="1"
        ads:srcCompat="@drawable/ic_barcode" //for Vector Image
        tools:ignore="VectorDrawableCompat" />

【讨论】:

【参考方案8】:

从你的drawable文件夹中删除两个文件夹,然后重建你的项目,它将正常工作

【讨论】:

以上是关于如何以编程方式将 VectorDrawable 设置为 ImageView 的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何第一次以编程方式将 ibeacon 与 iOS 配对

如何使用Android的VectorDrawable类绘制矢量图

Android开发 VectorDrawable 矢量图 矢量图动画放入到一个xml文件中

如何以编程方式检测 iPhone 6 和 6 Plus 视图模式 [重复]

如何以编程方式隐藏键盘剪贴板?

iOS 7 / Xcode 5:以编程方式访问设备启动图像