web-dev-qa-db-ja.com

setColorFilterが機能しない

Imageviewに簡単なカラーフィルターを実装して、黒の画像を白の画像に変えようとしています。それを達成するために、私は次のことを行います。

    weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
    weatherImg.setImageResource(R.drawable.b_clouded_rain);

また、カラーフィルターの色を赤と白に変更しようとしましたが、それらはすべて効果がありません。何が間違っていますか?

37
Tim Kranen

私は自分の質問に答えるのを嫌いながら、問題を見つけました:私は使用すべきでした:

   weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
82
Tim Kranen

適用するフィルタリングの種類によって異なります。透明度のある画像に新しい色を適用したくない場合、それが私にとってうまくいったことです:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);

このPorterDuffフィルターについて詳しく知りたい場合は、理解に役立つgoog記事を見つけました。 http://www.ibm.com/developerworks/Java/library/j-mer0918/ 読み取り:)

26
jsidera

Android 6.で同じ問題が発生しました。6。ImageView.getDrawable().setColorFilter()の代わりにImageView.setColorFilter()を使用して解決しました。

18

このコードを使用します

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource));
        drawable.mutate();
        DrawableCompat.setTint(drawable, getColor(color));
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

public static int getColor(int id) {
        return ContextCompat.getColor(getInstance().context, id);
    }

public static Drawable getDrawable(int id) {
        return ContextCompat.getDrawable(getInstance().context, id);
    }
4
Rafael

4.3を実行しているSamsung S3でsetColorFilterに問題があり、フィルターを機能させる唯一の方法は、draw(Canvas canvas)メソッドで適用することでした。

public class ColouredDrawable extends BitmapDrawable {

private ColorFilter mColorFilter;

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) {
    super(resources, toTransform);
    float[] matrix = {
            0, 0, 0, 0, ((toColour & 0xFF0000) / 0xFFFF),
            0, 0, 0, 0, ((toColour & 0xFF00) / 0xFF),
            0, 0, 0, 0, (toColour & 0xFF),
            0, 0, 0, 1, 0 };
    mColorFilter = new ColorMatrixColorFilter(matrix);
}

@Override
public void draw(Canvas canvas) {
    setColorFilter(mColorFilter);
    super.draw(canvas);
}

setColorFilterをBitmapDrawableに単純に適用しても効果はないようです。

3
dr_sulli

私にとっては、ImageViewsetColorFilter()を呼び出すだけでは機能しませんでした。

_imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+
_

何らかの理由で、API 21でsetColorFilter()を適切に機能させる唯一の方法は、ビューメッセージキューに変更を投稿することでした。

_imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+
_
2
styler1972

私にとっては、このソリューションのみが機能しました:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);

R.drawable.imgはベクター画像であり、ラスターリソースには影響しません

2
adray

Android 4.3および4.4の場合、setColorFilterは機能しません。代わりにDrawableCompatを使用してください。

    val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
            context,
            R.drawable.b_clouded_rain));
    DrawableCompat.setTint(drawable, foregroundColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN)
            .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);

    weatherImg.setImageResource(R.drawable.b_clouded_rain);
0
methodsignature