web-dev-qa-db-ja.com

androidでSVG画像の色を動的に変更する

サードパーティのライブラリを使用すると、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ファイルで動的に色を変更する方法を教えてください。

14

私はどこに問題があるのか​​分かりました。問題は、svgファイルで使用しているカラーコードにあります。正確にはxFF9FBF3Bではなく#9FBF3B
しかし、Javaコードの実行中は、ARGB値(0xFF9FBF3Bなど)を使用してコードを記述する必要があります)更新し、正常に動作しました。svgの色を変更できます同じコードのファイル。

これが実行時にSVG画像の色を変更しながら、他の人が実際のケースを特定するのにも役立つことを願っています。

10

遅いのはわかっていますが、この問題もあり、 setColorFilter(int color、PorterDuff.Mode mode) メソッドを使用してこの問題を修正することができました。

例:

imageView.setColorFilter(getResources().getColor(Android.R.color.black), PorterDuff.Mode.SRC_IN);
30
Antlip Dev

KotlinAntlip 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)
2
CoolMind

@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);
}
1