Androidでプログラム的に画像ビューの色合いを設定する方法は?


396

画像ビューの色合いを設定する必要があります...次のように使用しています:

imageView.setColorFilter(R.color.blue,android.graphics.PorterDuff.Mode.MULTIPLY);

しかし、それは変わりません...


15
整数カラー値の代わりに整数リソースIDを使用した可能性があります。R.color.blueをgetResources()。getColor(R.color.blue)に変換してみてください
milosmns '19年

ドローアブルドローアブル= ...; drawable.setColorFilter(ContextCompat.getColor(context、R.color.white)、PorterDuff.Mode.DST); imageView.setImageDrawable(drawable); //ここでは任意の色を使用できます
flame3

回答:


916

次のようにして、コードで色合いを非常に簡単に変更できます。

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); //白の色合い

色合いが欲しいなら

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

ベクタードローアブルの場合

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

更新
@ADevの彼の回答にはここで新しいソリューションがありますが、彼のソリューションには新しいサポートライブラリ(25.4.0以上)が必要です。



12
xml、android:tint = "@ color / blue"
Luis

1
さらにandroid:tintは21以上
androidguy 2017年

8
android:tintすべてのAndroidバージョンで動作します。多分あなたは話しているのdrawableTintですか?
finstas

11
PorterDuff.Mode.MULTIPLYが私の状況では機能しません。PorterDuff.Mode.SRC_INを使用しましたが、機能します
Mohamed Nageh

234

ほとんどの回答は、setColorFilter最初に要求されたものではない使用を参照しています。

ユーザー@Tad の答えは正しい方向にありますが、これはAPI 21以降でのみ機能します。

すべてのAndroidバージョンで色合いを設定するには、次を使用しImageViewCompatます。

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

yourTintこの場合、「カラー整数」でなければならないことに注意してください。のようなカラーリソースがある場合は、R.color.blue最初にcolor intをロードする必要があります。

ContextCompat.getColor(context, R.color.blue);

6
受け入れられる答えでなければなりません。ImageViewAppCompatテーマのxml インスタンスまたはAppCompatImageViewサブクラスでのみ機能することに注意してください。
Louis CAD

1
@ADevはあなたの解決策に感謝しますが、質問は2013年に行われ、ImageViewCompatとAppCompatImageViewリリースはv4サポートlib 25.4.0で2017年6月と25.1.0 2016年12月にそれぞれサポートされました:)
Hardik

1
もちろん、@ ADevですが、ソリューションが新しいため、新しいサポートライブラリ25.4.0以降が必要であるという回答で適切に言及していません。これは、下位バージョンのサポートライブラリではこのクラスが使用できないため、誰も見つけられないためです。 !! ちなみに私は答えを編集しました:)良い日...
Hardik

これは、API 16には動作しません
Tayyab Mazhar

49

これは私のために働いた

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

ええ、二番目のパラメータなしで、あまりにも私のために働いた...それも行くことができますmImageView.setColorFilter(getContext().getResources().getColor(R.color.green_500));
Biskremムハンマド

賛成投票され、2番目のパラメーターなしで、それは魅力のように機能します。Thx @ toobsco42
Ravi

35

@Hardikはそれを正しく持っています。コードのもう1つのエラーは、XML定義の色を参照するときです。setColorFilterIDを使用してカラーリソースを検索し、リソースsetColorFilterメソッドに渡す必要がある場合は、ID のみをメソッドに渡しました。以下の元のコードを書き換えます。

この行がアクティビティ内にある場合:

imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

そうでなければ、あなたはあなたの主な活動を参照する必要があります:

Activity main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

これは、整数、ブール値、次元など、他のタイプのリソースにも当てはまることに注意してください。文字列を除き、getString()最初に呼び出す必要なしにアクティビティで直接使用できますgetResources()(理由は聞かないでください)。 。

それ以外の場合、コードは適切に見えます。(私はsetColorFilterあまり方法を調査していませんが...)


22

すべての方法を試しましたが、うまくいきませんでした。

別のPortDuff.MODEを使用してソリューションを取得します。

imgEstadoBillete.setColorFilter(context.getResources().getColor(R.color.green),PorterDuff.Mode.SRC_IN);

14

Lollipopからは、新しいPaletteクラスで機能するBitmapDrawablesのtintメソッドもあります。

public void setTintList(ColorStateList tint)

そして

public void setTintMode(PorterDuff.Mode tintMode)

古いバージョンのAndroidでは、DrawableCompatライブラリを使用できるようになりました


2
実際、サポートライブラリはそれをサポートしています。私の答えをご覧ください: stackoverflow.com/a/34479043/878126
Android開発者、

12

これを試して。サポートライブラリがサポートするすべてのAndroidバージョンで動作するはずです。

public static Drawable getTintedDrawableOfColorResId(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorRes int colorResId) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), ContextCompat.getColor(context, colorResId));
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Bitmap inputBitmap, @ColorInt int color) {
    return getTintedDrawable(context, new BitmapDrawable(context.getResources(), inputBitmap), color);
}

public static Drawable getTintedDrawable(@NonNull Context context, @NonNull Drawable inputDrawable, @ColorInt int color) {
    Drawable wrapDrawable = DrawableCompat.wrap(inputDrawable);
    DrawableCompat.setTint(wrapDrawable, color);
    DrawableCompat.setTintMode(wrapDrawable, PorterDuff.Mode.SRC_IN);
    return wrapDrawable;
}

上記のいずれかを使用して機能させることができます。

DrawableCompatのより興味深い機能については、こちらのドキュメントをご覧ください


1
nullを返していimageView.getBackground()たため、ドローアブルを取得する必要もありましたimageView.getDrawable()
ロックリー

@RockLee必ず、イメージビューのxmlでsrcを使用するか、コードでsetImageResourceを使用してください
orelzion

これは、imageviewの背景にティントカラーを設定するのに最適な方法です
leegor

12

ADevのおかげでよりシンプルな拡張機能

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

使用法:-

imageView.setTint(R.color.tintColor)

Button / TextViewのテキストティントに同様のものはありますか?
Android開発者

textviewドローアブルのtextviewテキストの色または色合いを意味しますか?
Manohar Reddy

「テキストの色合い」を意味します。テキストの色。しかし、テキストには各状態の色があるので、それはかなり問題だと思います...次に、アクセントカラーを設定すると、どうしてうまく機能するのですか...奇数...アクセントカラーを特定のボタン(またはTextView)をプログラムで?
android開発者

11

色に16進数の透明度がある場合は、以下のコードを使用します。

ImageViewCompat.setImageTintMode(imageView, PorterDuff.Mode.SRC_ATOP);
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(Color.parseColor("#80000000")));

色合いをクリアするには

ImageViewCompat.setImageTintList(imageView, null);

「img」のタイプとは
Beyaz

1
@Beyaz imgのタイプはImageViewです。
Sai


9

最初の答えがうまくいかなかったので:

//get ImageView
ImageView myImageView = (ImageView) findViewById(R.id.iv);

//colorid is the id of a color defined in values/colors.xml
myImageView.setImageTintList(ColorStateList.valueOf(ContextCompat.getColor(getApplicationContext(), R.color.colorid)));

これはAPI 21以降でのみ機能するようですが、私にとっては問題ではありませんでした。ImageViewCompatを使用して、この問題を解決できます。

私は誰かを助けてくれれば幸いです:-)


7

Lollipopで始まる、ImageView#setImageTintList()使用できるメソッドがあります... ColorStateList単色ではなくを使用するという利点があり、イメージの色合いをステート対応にします。

Lollipop以前のデバイスでは、ドローアブルに色を付け、それをImageViewのイメージドローアブルとして設定することで、同じ動作を得ることができます。

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);

6
Random random=new Random;
ImageView imageView = (ImageView) view.findViewById(R.id.imageView);
ColorFilter cf = new PorterDuffColorFilter(Color.rgb(random.nextInt(255), random.nextInt(255), random.nextInt(255)),Mode.OVERLAY);

imageView.setImageResource(R.drawable.ic_bg_box);
imageView.setColorFilter(cf);

6

Androidでプログラム的に画像ビューの色合いを設定する

私はアンドロイドのための2つの方法があります:

1)

imgView.setColorFilter(context.getResources().getColor(R.color.blue));

2)

 DrawableCompat.setTint(imgView.getDrawable(),
                     ContextCompat.getColor(context, R.color.blue));

私は誰かを助けてくれれば幸いです:-)


4

追加ADEV答え Kotlinの普及、及びその便利な拡張機能するので、(私の意見では、最も正確です):

fun ImageView.setTint(context: Context, @ColorRes colorId: Int) {
    val color = ContextCompat.getColor(context, colorId)
    val colorStateList = ColorStateList.valueOf(color)
    ImageViewCompat.setImageTintList(this, colorStateList)
}

これは、どのAndroidプロジェクトにも役立つ機能だと思います。


4

色合い属性にカラーセレクターを使用できることがわかりました。

mImageView.setEnabled(true);

activity_main.xml:

<ImageView
    android:id="@+id/image_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/ic_arrowup"
    android:tint="@color/section_arrowup_color" />

section_arrowup_color.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@android:color/white" android:state_enabled="true"/>
    <item android:color="@android:color/black" android:state_enabled="false"/>
    <item android:color="@android:color/white"/>
</selector>

こんにちは、ベクタードローアブルでは機能しません。同じことの回避策はありますか?
Manukumar

@Manukumarのapp:srcCompat代わりに使用し、build.gradleファイルの一部にandroid:src追加vectorDrawables.useSupportLibrary = truedefaultConfigます。Kitkatエミュレーターで正常に動作することがテストされています。
アンドロイドデベロッパー

3

は使用しないPoterDuff.ModeでくださいsetColorFilter()。すべてで機能します。

ImageView imageView = (ImageView) listItem.findViewById(R.id.imageView);
imageView.setColorFilter(getContext().getResources().getColor(R.color.msg_read));

2

@milosmnsが言ったように、あなたは使うべきです imageView.setColorFilter(getResouces().getColor(R.color.blue),android.graphics.PorterDuff.Mode.MULTIPLY);

このAPIにはカラーリソースIDではなくカラー値が必要です。これが、ステートメントが機能しなかった根本的な原因です。


2

私はパーティーに遅れましたが、上に私の懇願を見ませんでした。を介してティントカラーを設定することもできsetImageResource()ます(私のminSdkVersionは24です)。

したがって、最初に、セレクターを作成して/drawableアセットフォルダーに保存する必要があります(私はそれを呼び出しますic_color_white_green_search.xml

<!-- Focused and not pressed -->
<item android:state_focused="true"
      android:state_pressed="false">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Focused and pressed -->
<item android:state_focused="true"
      android:state_pressed="true">

    <bitmap android:src="@drawable/ic_search"
            android:tint="@color/branding_green"/>
</item>

<!-- Default -->
<item android:drawable="@drawable/ic_search"/>

次に、次のようにコードで設定します。

val icon = itemView.findViewById(R.id.icon) as ImageButton
icon.setImageResource(R.drawable.ic_color_white_green_search)


0

ティンティングを設定および設定解除する拡張機能を使用したKotlinソリューション:

fun ImageView.setTint(@ColorInt color: Int?) {
    if (color == null) {
        ImageViewCompat.setImageTintList(this, null)
        return
    }
    ImageViewCompat.setImageTintMode(this, PorterDuff.Mode.SRC_ATOP)
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(color))
}

-4

正確な答えではありませんが、より簡単な代替策:

  • 画像の上に別のビューを配置します
  • 変更アルファあなたは所望の効果を得るために(プログラム的に)したいしかしビューの値を。

これはそのスニペットです:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:contentDescription="@string/my_description"
        android:scaleType="fitXY"
        android:src="@drawable/my_awesome_image"/>

    <View
        android:layout_width="match_parent"
        android:layout_height="@dimen/height120"
        android:alpha="0.5"
        android:background="@color/my_blue_color"/>
</FrameLayout>

これは色合いについてです!透明性のためのアルファではありません。
David

しかし、それは色合いとして機能することになります。自分で試してみてください。これは、物事を見る1つの方法にすぎません。
Shubham Chaudhary、2016

@ShubhamChaudhary私はこれが遅いことを知っていますが、画像が遅い場合はどうでしょうかpng。その後、背景は変わりませんか?また、アルファと色合いは大きく異なります。色合いは、私が間違っていなければ、色の置き換えのようなものです。意図された攻撃はありません。:)
KISHORE_ZE 2016年

有効なポイント。この答えは私の場合に役立ちました。希望は他人の靴にも合う。
Shubham Chaudhary
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.