web-dev-qa-db-ja.com

アンドロイドでプログラム的にイメージビューの色合いを設定する方法?

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

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

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

314
user2968768

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

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

_ update _
@ ADevは彼の答えの中で新しい解決策を持っています ここ 、しかし彼の解決策は新しいサポートライブラリを必要とします - 25.4.0以上。

736
Hardik

ほとんどの回答はsetColorFilterを使用することを参照していますが、これは最初に求められたものではありません。

ユーザー@Tadは 彼の答え を正しい方向に持っていますが、それはAPI 21+でしか動作しません。

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

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

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

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

これは私のために働きました

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

@Hardikはそれを正しく持っています。コード内のもう1つのエラーは、XML定義の色を参照したときです。 IDを使用してカラーリソースを検索し、 resource setColorFilterメソッドに渡す必要がある場合は、idのみをsetColorFilterメソッドに渡しました。下記のオリジナルのコードを書き直してください。

この行があなたの活動の範囲内であれば:

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メソッドを調べすぎたことはありませんが…)

34
CrepeGoat

私はすべての方法を試した後、彼らは私のために動作しませんでした。

別のPortDuff.MODEを使用して解決策を得ます。

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

Lollipopから始めて、新しいPaletteクラスで動作するBitmapDrawables用の tint メソッドもあります。

public void setTintList(ColorStateList tint)

そして

public void setTintMode(PorterDuff.Mode tintMode)

Androidの古いバージョンでは、 DrawableCompat ライブラリを使用できます。

12
Tad

これを試して。サポートライブラリがサポートするすべての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のもっとおもしろい機能については here で読むことができます。

9

シンプルで一行

imageView.setColorFilter(activity.getResources().getColor(R.color.your_color));
9
Gautam Surani

Lollipopからはじめて ImageView#setImageTintList() というメソッドが使えるようになりました。単色ではなくColorStateListを取るので、画像の色合いを状態認識にすることができます。

Lollipopより前のデバイスでは、ドロアブルを着色してからそれをImageViewのimageドロアブルとして設定することで、同じ動作を実現できます。

ColorStateList csl = AppCompatResources.getColorStateList(context, R.color.my_clr_selector);
Drawable drawable = DrawableCompat.wrap(imageView.getDrawable());
DrawableCompat.setTintList(drawable, csl);
imageView.setImageDrawable(drawable);
6
Alex Lockwood
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);
5
Pawan asati

最初の答えは私にはうまくいきませんでした。

//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を使ってこの問題を解決することができます。

私は私が誰かを手伝ってくれることを願っています:-)

4
Felix

あなたの色が16進透明度を持っているならば、以下のコードを使ってください。

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

色合いをクリアする

ImageViewCompat.setImageTintList(img, null);
4
Sai Kiran

PoterDuff.Modeを使用しないでください、setColorFilter()を使用してください。

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

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

mImageView.setEnabled(true);

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>
2
NickUnuchek

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

Androidには2つの方法があります。

1)

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

2)

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

私は私が誰かを手伝ってくれることを願っています:-)

1
Abhign01

私はパーティーに遅刻しました、しかし私は上の私の解決策を見ませんでした。 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)
1
Hesam

Kotlinが広く採用されて以来、 ADevanswer に追加しています(これは私の考えでは最も正しい)。

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

私はこれがどんなAndroidプロジェクトで持っているのに役に立つかもしれない機能であると思います!

1
Cillian Myles

ADev のおかげでより単純化された拡張機能

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

使用法: -

imageView.setTint(R.color.tintColor)
1
Manohar Reddy

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

このAPIはカラーリソースIDの代わりにカラー値を必要とします。それがあなたのステートメントがうまくいかなかった理由の根本的な原因です。

1
HunkD

あなたの色合いにselectorを設定したい場合は:

ImageViewCompat.setImageTintList(iv, getResources().getColorStateList(R.color.app_icon_click_color));

追加するだけで、既存のティントカラーを削除したい場合は、透明カラーに設定できます。

mSignInButton.setColorFilter(Color.TRANSPARENT);
0
Stephen Liu