プログラムで描画可能な色を変更する


139

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

Drawable.setColorFilter( 0xffff0000, Mode.MULTIPLY )

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


受け入れ答えはために動作しませんでしたme..usedこの回答する方法 [1]、[1]:stackoverflow.com/questions/5940825/...
sham.y

ここでの答えはすべて背景色を変更しますが、画像の色は変更しないと思います。私は正しいですか?誰か教えてもらえますか?私はここですべての解決策を試しましたが、stackoverflowでも同じ質問をしましたが、場合によっては背景色のみが変更されます。したがって、変更できるのは背景色のみで、画像の色は変更できません。私は正しいですか?
Shirish Herwade

回答:


258

これを試して:

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

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


うーん、色は白のままです。OverlayItems問題を引き起こしている可能性のあるhello mapview クラスと関係があるのでしょうか?それは私のresフォルダーから通常のドローアブルで、特別なものは何もありません...
Johan

だから解決策は何でしたか?
speedynomads 2013年

@ρяσѕρєяKあなたはとても素晴らしいです。とても役に立ちます
luttu android

30
より広範囲のソースカラーで動作させる場合は、PorterDuff.Mode.SRC_INを使用することをお勧めします。
Lorne Laliberte、2015

1
PorterDuffColorFilterコンストラクターはARGBカラー形式を取ります
RichX

124

あなたはSVGベクタードローアブルのためにこれを試すことができます

DrawableCompat.setTint(
    DrawableCompat.wrap(myImageView.getDrawable()),
    ContextCompat.getColor(context, R.color.another_nice_color)
);

4
私がsvgで見た最良の方法。
apSTRK 2017年

1
受け入れられた答えよりもこれを優先しますが、どちらも機能しますが、これを使用すると、設定するドローアブルを心配する必要がありません。すでにそこにあるものを取得するだけで、下位互換性があり、素晴らしいです!
RJFares 2017年

1
何もうまくいかなかったときのベストアンサーは魅力のように機能します!どうもありがとう!注:imageView / AppCompatImageViewにDrawable xmlがある場合にも機能します
Sjd

1
プログラムで削除する方法は?
Hardik Joshi 2018

1
@HardikJoshi Documentationによると:色合いをクリアするには、次のパスに移動nullしますDrawable#setTintList(ColorStateList)
arekolek

23

ドローアブルで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);

21

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"/>

ドローアブルで使用したい色の数が限られている場合、これはうまくいきます。詳細については、私のブログ投稿をご覧ください


2
いいね!ところで、これはpre-Lollipopでもうまくいくようです。(minSdkVersion 16Android 4.1.1デバイスでこれをテストしただけです。)
Jonik

この方法でビットマップを作成すると、を使用する場合のように、レイアウトに合わせて伸縮しませんandroid:background="..."。かなり奇妙です!
王子

ここでは9つのパッチを作成していないからだと思います。
MinceMan、2015年

申し訳ありませんが、このページは存在しません=(
ファンファンリン

@Jonik提供された質問の回答は無関係です。この質問は、Drawableを変更する方法を求めていますの色ではなく、ImageViewのを。
Antony.H 2017


10

私はあなたがコンテキストを渡すことができる一般的な関数を書きました、アイコンはidのdrawable / mipmap画像アイコンであり、そのアイコンに必要な新しい色です。

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

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);

9

キーの色が白なので、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);

7

これでうまくいきました。0xとカラーコードの間に「ff」を入れてください。このように0xff2196F3

Drawable mDrawable = ContextCompat.getDrawable(MainActivity.this,R.drawable.ic_vector_home);
                    mDrawable.setColorFilter(new
                            PorterDuffColorFilter(0xff2196F3,PorterDuff.Mode.SRC_IN));

こんにちは@Bekさん、stackoverflowへようこそ。これがあなたのために働いたなら、それを示すために最小限の解決策でjsfiddleを含めることは非常に役に立ちます。質問を投稿した人が正しく理解するのに役立ちます。
Arjun Chaudhary 2017年

6

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

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

注:ここのコードはKotlinです。


3

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

MozillaのサイトにあるCompositingを見て回ることをお勧めします。(彼らはアンドロイドが持っているすべてのモードを持っているわけではありませんが、彼らはそれらの多くを持っています)


3

これを使用:Javaの場合

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

コトリン

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

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



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;
}

0

単に使う

    android:drawableTint="@color/primary_color"

XMLファイル内。primary_colorをカスタムカラーに置き換える


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);

0

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

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

または

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

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


これは、OPがドローアブルではなくimageViewsを使用している場合にのみ機能します。
SowingFiber

0

Kotlinを使用する人のために、単純な拡張関数:

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

そして単純に

background.tint(context, R.color.colorPrimary)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.