imageview länge - Wie man Farbton für eine Bildansicht programmgesteuert in Android einstellt?



meta title (13)

Müssen Farbton für eine Bildansicht einstellen ... Ich verwende es auf folgende Weise:

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

Aber es ändert sich nicht ...


Answers

Keine exakte Antwort, sondern eine einfachere Alternative:

  • Platzieren Sie eine andere Ansicht oben auf dem Bild
  • Ändern Sie den Alpha- Wert der Ansicht wie gewünscht (programmgesteuert), um den gewünschten Effekt zu erzielen.

Hier ist ein Ausschnitt dafür:

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

Wenn Ihre Farbe Hex Transparenz hat, verwenden Sie den folgenden Code.

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

Um den Farbton zu löschen

ImageViewCompat.setImageTintList(img, null);

Nachdem ich alle Methoden ausprobiert habe und sie nicht für mich gearbeitet haben.

Ich bekomme die Lösung mit einem anderen PortDuff.MODE.

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

Ich habe festgestellt, dass wir den Farbselektor für den Farbton attr verwenden können:

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>

Sie können den Farbton ganz einfach im Code ändern über:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Weiße Tönung

Wenn Sie einen Farbton wünschen, dann

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

Für Vektor Drawable

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

UPDATE : @ADev hat eine neuere Lösung in seiner Antwort here aber scheint er vergessen zu erwähnen, seine Lösung erfordern neuere Support-Bibliothek 25.4.0 oder höher.


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

Versuche dies. Es sollte bei allen Android-Versionen funktionieren, die von der Support-Bibliothek unterstützt werden:

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

Sie können eines der oben genannten verwenden, damit es funktioniert.

Sie können hier mehr über interessante Funktionen von DrawableCompat in den Dokumenten lesen.


@Hardik hat es richtig gemacht. Der andere Fehler in Ihrem Code ist, wenn Sie auf Ihre XML-definierte Farbe verweisen. Sie haben der setColorFilter Methode nur die ID setColorFilter , wenn Sie die ID zum setColorFilter der setColorFilter verwenden und die Ressource an die setColorFilter Methode übergeben setColorFilter . Überschreiben Sie Ihren ursprünglichen Code unten.

Wenn diese Zeile in Ihrer Aktivität enthalten ist:

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

Andernfalls müssen Sie auf Ihre Haupttätigkeit verweisen:

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

Beachten Sie, dass dies auch für die anderen Ressourcentypen gilt, z. B. Integer, Boole, Dimensionen usw. Außer für Zeichenfolge, für die Sie in Ihrer Aktivität direkt getString() können, ohne zuerst getResources() aufrufen zu getResources() (don Frag mich nicht warum.

Ansonsten sieht dein Code gut aus. (Obwohl ich die setColorFilter Methode nicht zu sehr untersucht habe ...)


Beginnend in Lollipop gibt es eine Methode namens ImageView#setImageTintList() , die Sie verwenden können ... der Vorteil ist, dass es eine ColorStateList im Gegensatz zu nur einer einzigen Farbe benötigt, wodurch der Farbton des Bildes bewusst wird.

Auf Pre-Lollipop-Geräten können Sie dasselbe Verhalten erzielen, indem Sie das ImageView tönten und es dann als ImageView des ImageView -Objekts festlegen:

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

Ab Lollipop gibt es auch eine tint Methode für BitmapDrawables, die mit der neuen Palette-Klasse arbeitet:

public void setTintList (ColorStateList-Farbton)

und

Öffentlicher void setTintMode (PorterDuff.Mode tintMode)

In älteren Versionen von Android können Sie jetzt die DrawableCompat Bibliothek verwenden


Das hat für mich funktioniert

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

Die meisten Antworten beziehen sich auf setColorFilter was nicht das ist, was ursprünglich gefragt wurde.

Der Benutzer @Tad hat seine Antwort in die richtige Richtung, aber er funktioniert nur auf API 21+.

Verwenden Sie das ImageViewCompat um den Farbton für alle Android-Versionen ImageViewCompat :

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

Beachten Sie, dass yourTint in diesem Fall ein "color int" sein muss. Wenn Sie eine R.color.blue wie R.color.blue , müssen Sie zunächst die Farbe int laden:

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

Diese Frage wird an vielen Orten auf viele verschiedene Arten gestellt. Ich habe es ursprünglich hier beantwortet, aber ich denke, dass es auch in diesem Thread relevant ist (da ich hier endete, als ich nach einer Antwort suchte).

Es gibt keine Ein-Zeilen-Lösung für dieses Problem, aber das funktionierte für meinen Anwendungsfall. Das Problem ist, dass der Konstruktor "View (context, attrs, defStyle)" nicht auf einen tatsächlichen Stil verweist, sondern ein Attribut. Wir werden:

  1. Definieren Sie ein Attribut
  2. Erstellen Sie einen Stil, den Sie verwenden möchten
  3. Wenden Sie einen Stil für dieses Attribut auf unser Thema an
  4. Erstellen Sie neue Instanzen unserer Sicht mit diesem Attribut

Definieren Sie in 'res / values ​​/ attrs.xml' ein neues Attribut:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

In res / values ​​/ styles.xml 'Ich werde den Stil erstellen, den ich in meinem benutzerdefinierten TextView verwenden möchte

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

Ändern Sie in 'res / values ​​/ themes.xml' oder 'res / values ​​/ styles.xml' das Design für Ihre Anwendung / Aktivität und fügen Sie den folgenden Stil hinzu:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Schließlich können Sie in Ihrem benutzerdefinierten TextView jetzt den Konstruktor mit dem Attribut verwenden und er erhält Ihren Stil

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Es ist erwähnenswert, dass ich customTextView wiederholt in verschiedenen Varianten und an verschiedenen Stellen verwendet habe, aber es ist in keiner Weise erforderlich, dass der Name der Ansicht dem Stil oder dem Attribut oder irgendetwas entspricht. Außerdem sollte diese Technik mit jeder benutzerdefinierten Ansicht funktionieren, nicht nur mit TextViews.





android imageview tint