181

白いマーカー画像の色をコードで変更しようとしています。以下のコードで色が変わるはずですが、マーカーは白のままです。

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

私は何か見落としてますか?resフォルダにあるドローアブルの色を変更する他の方法はありますか?

4

19 に答える 19

317

これを試して:

Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, R.drawable.my_drawable); 
Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
DrawableCompat.setTint(wrappedDrawable, Color.RED);    

DrawableCompatAPI 22以前のデバイスで下位互換性とバグ修正を提供するため、使用は重要です。

于 2012-07-07T16:12:04.150 に答える
154

あなたはsvgベクトルdrawableのためにこれを試すことができます

DrawableCompat.setTint(
    DrawableCompat.wrap(myImageView.getDrawable()),
    ContextCompat.getColor(context, R.color.another_nice_color)
);
于 2016-10-06T09:40:44.257 に答える
35

ドローアブルでmutate()を呼び出す必要がある場合があります。そうしないと、すべてのアイコンが影響を受けます。

Drawable icon = ContextCompat.getDrawable(getContext(), R.drawable.ic_my_icon).mutate();
TypedValue typedValue = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorIcon, typedValue, true);
icon.setColorFilter(typedValue.data, PorterDuff.Mode.SRC_ATOP);
于 2016-01-21T07:11:06.073 に答える
29

あなたはこれを試すことができますImageView。を使用しsetColorFilter()ます。

imageView.setColorFilter(ContextCompat.getColor(context, R.color.colorWhite));
于 2018-01-16T09:03:32.310 に答える
22

Lollipop、android 5.+でこれを行う別の方法は、次のように描画可能なビットマップに色合いを設定することです。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

これは、ドローアブルに使用する色の数が限られている場合に役立ちます。詳細については、私のブログ投稿を確認してください

于 2014-12-09T17:03:02.197 に答える
12

コンテキストを渡すことができる汎用関数を作成しました。アイコンはIDドローアブル/ミップマップイメージアイコンであり、そのアイコンに必要な新しい色です。

この関数はドローアブルを返します。

public static Drawable changeDrawableColor(Context context,int icon, int newColor) {
    Drawable mDrawable = ContextCompat.getDrawable(context, icon).mutate(); 
    mDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.SRC_IN)); 
    return mDrawable;
} 

changeDrawableColor(getContext(),R.mipmap.ic_action_tune, Color.WHITE);
于 2017-03-20T08:28:19.473 に答える
10

キーの色が白なので、ColorMatrixColorFilterを試すことができます。

// Assuming "color" is your target color
float r = Color.red(color) / 255f;
float g = Color.green(color) / 255f;
float b = Color.blue(color) / 255f;

ColorMatrix cm = new ColorMatrix(new float[] {
        // Change red channel
        r, 0, 0, 0, 0,
        // Change green channel
        0, g, 0, 0, 0,
        // Change blue channel
        0, 0, b, 0, 0,
        // Keep alpha channel
        0, 0, 0, 1, 0,
});
ColorMatrixColorFilter cf = new ColorMatrixColorFilter(cm);
myDrawable.setColorFilter(cf);
于 2012-07-07T16:38:25.610 に答える
9

これは私のために働いた。0xとカラーコードの間に必ず「ff」を入れてください。このように0xff2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));
于 2017-11-15T04:14:45.163 に答える
6

受け入れられた答えと同じですが、より簡単な便利な方法:

val myDrawable = ContextCompat.getDrawable(context, R.drawable.my_drawable)
myDrawable.setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN)
setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null)

ここでのコードはKotlinであることに注意してください。

于 2017-05-18T17:51:17.410 に答える
4

Kotlinを使用する人のために:簡単な拡張機能:

fun Drawable.tint(context: Context,  @ColorRes color: Int) {
    DrawableCompat.setTint(this, context.resources.getColor(color, context.theme))
}

そして単にする

background.tint(context, R.color.colorPrimary)
于 2020-07-08T20:44:42.980 に答える
3

Mode.LIGHTENまたはを試してみてくださいMode.DARKEN。Android Javadocは、PorterDuffモードの機能を説明するのが恐ろしいです。あなたはここでそれらを見ることができます:PorterDuff | アンドロイド

こちらのMozillaのサイトで合成を見て回ることをお勧めします。(Androidのようなすべてのモードを備えているわけではありませんが、多くのモードがあります)

于 2012-07-07T16:12:55.787 に答える
3

これを使用してください:Javaの場合

view.getBackground().setColorFilter(Color.parseColor("#343434"), PorterDuff.Mode.SRC_OVER)

Kotlinの場合

view.background.setColorFilter(Color.parseColor("#343434"),PorterDuff.Mode.SRC_OVER)

背景の角が丸い場合などは、PorterDuff.Mode.SRC_ATOPを使用できます。

于 2019-07-12T19:55:28.347 に答える
2

構文

"your image name".setColorFilter("your context".getResources().getColor("color name"));

myImage.setColorFilter(mContext.getResources().getColor(R.color.deep_blue_new));
于 2019-05-03T10:06:30.787 に答える
2

この方法で描画可能な色を変更できます。

background = view.findViewById(R.id.background)

val uDrawable = AppCompatResources.getDrawable(view.context, R.drawable.background)
uDrawable?.let {
      val wDrawable = DrawableCompat.wrap(it)
      DrawableCompat.setTint(wDrawable, ContextCompat.getColor(view.context, 
                                                      color /*specify your int color code*/))
      background.background = wDrawable
}
于 2021-03-03T14:46:47.637 に答える
2

SDK> = 21 1行myIconImageView.getDrawable()。setTint(getResources()。getColor(myColor))

于 2021-07-05T03:21:07.803 に答える
0

これは私がしたことです:

public static Drawable changeDrawableColor(int drawableRes, int colorRes, Context context) {
    //Convert drawable res to bitmap
    final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), drawableRes);
    final Bitmap resultBitmap = Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth() - 1, bitmap.getHeight() - 1);
    final Paint p = new Paint();
    final Canvas canvas = new Canvas(resultBitmap);
    canvas.drawBitmap(resultBitmap, 0, 0, p);

    //Create new drawable based on bitmap
    final Drawable drawable = new BitmapDrawable(context.getResources(), resultBitmap);
    drawable.setColorFilter(new
            PorterDuffColorFilter(context.getResources().getColor(colorRes), PorterDuff.Mode.MULTIPLY));
    return drawable;
}
于 2016-05-16T16:40:56.943 に答える
0

次のようなメソッドを作成します。

//CHANGE ICON COLOR
private void changeIconColor(Context context ,int drawable){
    Drawable unwrappedDrawable = AppCompatResources.getDrawable(context, drawable);
    assert unwrappedDrawable != null;
    Drawable wrappedDrawable = DrawableCompat.wrap(unwrappedDrawable);
    DrawableCompat.setTint(wrappedDrawable, getResources().getColor(R.color.colorAccent));
}

そしてそれをそのように使用します:

    changeIconColor(this,R.drawable.ic_home);
于 2019-09-02T16:38:25.677 に答える
0

それを行う最も簡単な方法:

imageView.setColorFilter(Color.rgb(r, g b));

また

imageView.setColorFilter(Color.argb(a, r, g, b));

a、r、g、b:カラーargb値。

于 2019-11-27T11:35:25.257 に答える
0

短編小説:

public void changeDrawableColor(Drawable drawable,int color){
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
}

public Drawable getColoredDrawable(@DrawableRes int resid,int color){
    Drawable drawable= ContextCompat.getDrawable(context, resid).mutate();
    drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    return drawable;
}
于 2021-05-30T07:54:57.647 に答える