在android中动态改变SVG图像颜色

Posted

技术标签:

【中文标题】在android中动态改变SVG图像颜色【英文标题】:Dynamically change SVG image color in android 【发布时间】:2014-12-24 22:31:12 【问题描述】:

我知道使用第三方库,可以在 android 中使用 SVG 图像。 图书馆喜欢:svg-android

加载SVG图像的代码如下:

 public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    // Create a new ImageView
    ImageView imageView = new ImageView(this);
    // Set the background color to white
    imageView.setBackgroundColor(Color.WHITE);
    // Parse the SVG file from the resource
    SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.android);
    // Get a drawable from the parsed SVG and set it as the drawable for the ImageView
    imageView.setImageDrawable(svg.createPictureDrawable());
    // Set the ImageView as the content view for the Activity
    setContentView(imageView);

一切正常。我可以看到图像。但现在我想在运行时更改 svg 图像的颜色。 为此,我尝试了相同项目描述中提到的以下代码。

  // 0xFF9FBF3B is the hex code for the existing Android green, 0xFF1756c9 is the new blue color
    SVG svg = SVGParser.getSVGFromResource(getResources(), R.raw.android, 0xFF9FBF3B, 0xFF1756c9);

但是我看不到颜色的变化。所以我想知道如何在Java文件中动态改变颜色。

【问题讨论】:

确保此颜色0xFF9FBF3B 存在于您的 svg 中(只需在文本编辑器中打开它并搜索此值)。请记住,颜色更改仅在加载文件时发生,而不是动态发生。因此,只需重新加载文件即可应用颜色更改。 【参考方案1】:

你可以使用:drawableTint来改变颜色

【讨论】:

【参考方案2】:

@Antlip Dev 所说的是正确的,但该方法现在已被弃用。 这是更新版本:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) 
    drawable.setColorFilter(new BlendModeColorFilter(color, BlendMode.SRC_ATOP));
 else 
   drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);

【讨论】:

【参考方案3】:

Kotlin 中使用Antlip Dev 的答案。

package com.example.... // Your package.

import android.graphics.PorterDuff
import android.widget.ImageView
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat

fun ImageView.setSvgColor(@ColorRes color: Int) =
    setColorFilter(ContextCompat.getColor(context, color), PorterDuff.Mode.SRC_IN)

用法:

view.your_image.setSvgColor(R.color.gray)

【讨论】:

最好避免使用!!只要有可能,最好做一些类似 context?.let setSvgColor(it, ... @crobicha,我同意你的看法。但是当你从viewcontext != null调用这些方法时。 @crobicha,感谢您的回答。我简化了方法。请查看更新。【参考方案4】:

我知道这有点晚了,但我也遇到了这个问题,并且能够使用 setColorFilter(int color, PorterDuff.Mode mode) 方法解决这个问题。

例子:

imageView.setColorFilter(getResources().getColor(android.R.color.black), PorterDuff.Mode.SRC_IN);

【讨论】:

【参考方案5】:

我知道问题出在哪里。 问题在于我在 svg 文件中使用的颜色代码。 它不完全是 0xFF9FBF3B 而是 #9FBF3B 但是在 java 代码中,你必须用 ARGB 值(例如 0xFF9FBF3B)来编写它。 我已经更新了它,它现在工作正常。我可以使用相同的代码更改 svg 文件的颜色。

希望这也有助于其他人在运行时更改 SVG 图像的颜色时识别实际情况。

【讨论】:

我无法在 imageview firebasestorage.googleapis.com/v0/b/… color 中更改此图像的颜色,您知道我该怎么做吗? 您能否查看@Antlip Dev 的答案。那更准确。 此外,我们在 XML 中为 Imageview 提供了 tintColor 选项。你也可以试试。 tint 选项只能更改具有 .xml 格式且我具有 .svg 格式 url 的图像 您还可以动态更改SVG图像颜色。

以上是关于在android中动态改变SVG图像颜色的主要内容,如果未能解决你的问题,请参考以下文章

SVG 在 Safari 10 中旋转时改变颜色

如何将图案图像动态添加到 svg?

SVG 作为 MIXIN 中的背景图像通过 SASS 变量设置颜色

img src SVG改变填充颜色

如何将 SVG 的填充颜色更改为背景图像? [复制]

如何在 Angular 中更改 svg 元素的颜色?