2010-06-11 5 views
49

Ich habe eine ImageButton in meiner App und ich muss den Farbton des Bildes ändern, wenn die Schaltfläche pressed/focused ist. Ich habe den ImageButton Satz seine src aus einer XML-Datei zu erhalten, die wie folgt:Wie ändere ich den Farbton eines ImageButton im Fokus/drücken Sie

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- pressed --> 
    <item 
     android:state_pressed="true" 
     android:tint="@color/black" 
     android:drawable="@drawable/search" 
     /> 

    <!-- focused --> 
    <item 
     android:state_focused="true" 
     android:tint="@color/black" 
     android:drawable="@drawable/search" 
     /> 

    <!-- default --> 
    <item 
     android:tint="@null" 
     android:drawable="@drawable/search" 
     /> 

</selector> 

jedoch die Tönung nicht angewendet, wenn die ImageButton gedrückt wird oder fokussiert - das Bild zeigt nur wie normal. Die Farbe Schwarz ist wie immer definiert als #000000. Irgendwelche Ideen?

+4

Hallo. Ich habe mich gefragt, ob Sie endlich eine XML-Lösung gefunden haben. Danke im Voraus. –

Antwort

70

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

ImageButton button = (ImageButton) this.findViewById(R.id.button_i_want_to_modify); 
button.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint 

Hoffe, es hilft.

JS

+8

Werke. Aber ich möchte es via XML, wenn möglich (sorry picky). –

+0

Überprüfen Sie die Antwort unter http://stackoverflow.com/questions/19500039/how-to-use-selector-to-tint-imageview-in-android – asiby

+0

Oder Datenbindung verwenden. – ubuntudroid

-2

Wie Sie den Wähler definiert die src des Image Android sein wird, die ziehbar nehmen AFAIK nur weil das ist, was die Art der src entspricht. So wird kein Farbton verwendet.

Trotzdem hatte ich ein ähnliches Problem: Ich habe auch versucht, einen Selektor wie das Ihre verwenden, sondern auch für die Android-Version: Tonwert des Image anstelle von Android: src. Natürlich habe ich die Farbtonwerte ausgelassen, die Sie in Ihrem Selektor haben. Dies würde auch Ihr Problem lösen, weil Sie dasselbe Zeichen für alle Zustände verwenden möchten. Seltsamerweise bekomme ich jedes Mal eine NumberFormatException, die besagt, dass das System "res/color/tint_selector.xml" (was tatsächlich mein Selektor ist) nicht als Integer analysieren konnte. Um genau zu sein mein Code wie folgt aussieht:

Das ist mein Selektor ist, gespeichert in /res/color/tint_selector.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" 
     android:color="#D3D3D3"/> <!-- pressed --> 
    <item android:color="#ff000000"/> <!-- default --> 
</selector> 

Und das ist die entsprechende Image:

<ImageButton android:id="@+id/program_help" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:src="@drawable/symbol" 
    android:tint="@color/tint_selector"> 
</ImageButton> 

Vielleicht hilft dir das ein bisschen, obwohl es momentan nicht funktioniert.

+0

Ist dies kompatibel mit APIs unter 21? – JHowzer

1

Was ich mache, ist eine benutzerdefinierte Schaltfläche hinzufügen, die die Funktion setColorFilter hat.

So kann ich die neue Schaltfläche in der XML verwenden.

public class CustomButton extends Button { 

public CustomButton(Context context) { 
    super(context); 
} 

public CustomButton(Context context, AttributeSet attributes) { 
    super(context, attributes); 
}; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int maskedAction = event.getActionMasked(); 
    if (maskedAction == MotionEvent.ACTION_DOWN) 
     getBackground().setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN); 
    else if (maskedAction == MotionEvent.ACTION_UP) 
     getBackground().setColorFilter(null); 
    return super.onTouchEvent(event); 
}} 

und für die Image

public class CustomImageButton extends ImageButton { 

public CustomImageButton(Context context) { 
    super(context); 
} 

public CustomImageButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    int maskedAction = event.getActionMasked(); 
    if (maskedAction == MotionEvent.ACTION_DOWN) 
     setColorFilter(Color.argb(150, 155, 155, 155), PorterDuff.Mode.DST_IN); 
    else if (maskedAction == MotionEvent.ACTION_UP) 
     setColorFilter(null); 
    return super.onTouchEvent(event); 
}} 
1

Ich bemerkte es wollen einige Anfragen hier für die Menschen wissen, wie dies in XML zu tun. Es ist eigentlich ziemlich einfach.

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@drawable/some_button_highlighted" /> 
    <item android:drawable="@drawable/some_button_image" /> 
</selector> 

Und das ist der markierte ziehbar (ziehbar/some_button_highlighted.xml)

<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/some_button_image"/> 
    <item> 
     <shape> 
      <solid android:color="@color/highlighted_button_color" /> 
     </shape> 
    </item> 
</layer-list> 

Jetzt: Dies kann Ihre Schaltfläche ziehbar (ziehbar/some_button.xml) mit einem layer-list

erreicht werden Sie können dies in jedem anderen Xml verwenden:

... 
android:drawable="@drawable/some_button" 
... 

Ich hoffe dies hilft jemandem in der Zukunft.

+3

Dies zeichnet nur ein festes Quadrat über das Zeichenfeld. Wenn es eine Möglichkeit gäbe, die zweite Ebene als vorherige Alpha-Maske zu verwenden, wäre das cool. – darnmason

2
bt.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         bt.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint 
         return true; // if you want to handle the touch event 
        case MotionEvent.ACTION_UP: 
         bt.clearColorFilter(); // White Tint 
         return true; // if you want to handle the touch event 
       } 
       return false; 
      } 
     }); 
5

Endlich habe ich die Lösung für API < 21 finden:

Button more = (Button) findViewById(R.id.more); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    more.getBackground().setColorFilter(color, PorterDuff.Mode.SRC_IN); 
} else { 
    Drawable wrapDrawable = DrawableCompat.wrap(more.getBackground()); 
    DrawableCompat.setTint(wrapDrawable, color)); 
    more.setBackgroundDrawable(DrawableCompat.unwrap(wrapDrawable)); 
} 

Kann diese Hilfe jemand nicht zu verlieren 2 Stunden!

+0

Wenn Sie drawablecompat verwenden, sollten Sie es verwenden können niedrigere API-Versionen ohne Problem – dabluck

+0

Ich verwendete eine normale Schaltfläche mit einem benutzerdefinierten XML-Layout. DrawableCompat war bis heute der einzige Fix, der auf API 21 funktioniert. –

4

Ich habe einen Weg gefunden, dies in xml zu tun (in api 21 und höher mindestens).

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" > 
     <bitmap 
      android:src="@drawable/search" 
      android:tint="@color/black" 
      /> 
    </item> 
    <item android:drawable="@drawable/search"/> 
</selector> 

den Farbton auf dem Bitmap Durch die Einstellung ist es möglich, die gleiche ziehbar in xml wieder zu verwenden, ohne berührt oder Unterklasse Image oder Image abzufangen.

Sobald der Selektor erstellt wurde, wenden Sie dies als src des ImageView oder ImageButton an.

+0

Netter Fang! Bitte beachten Sie, dass das Tint-Attribut auf dem Bitmap-Element vor API 21 nichts bewirkt -> https://code.google.com/p/android/issues/detail?id=78461 – Gomino

0

Sie können Farbe (Farbton) von XML einstellen.

Set transparent (android:background="@null") für background dann tint verwenden:

<ImageButton 
    android:layout_width="wrap_content" 
    android:layout_height="fill_parent" 
    android:tint="@color/Amber_200" 
    android:background="@null" 
    android:src="@drawable/back_selector" /> 
1

Hier ist, wie es gerade tat XML. Erstellen Sie in Ihrem zeichnenden Ordner einen Selektor. ZB: touch_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 

    <!-- State when a row is being pressed, but hasn't yet been activated (finger down) --> 
    <item android:state_pressed="true" android:color="@color/semi_slate" /> 

    <!-- When the view is "activated". In SINGLE_CHOICE_MODE, it flags the active row 
    of a ListView --> 
    <item android:state_activated="true" android:color="@color/semi_slate" /> 

    <!-- Default, "just hangin' out" state. --> 
    <item android:color="@android:color/transparent" /> 
</selector> 

In meiner Bildansicht in xml stellte ich das android: Farbton-Attribut auf die ziehbar oben erstellt.

android:tint = "@drawable/touch_selector" 

Der gesamte Code sah wie folgt aus:

<?xml version="1.0" encoding="utf-8"?> 
<ImageView xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/poster" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:adjustViewBounds="true" 
android:scaleType="centerCrop" 
android:tint="@drawable/touch_selector" /> 

Dies ist eine alle xml-Lösung, Farbton auf einem Image auf Presse oder aktiv zu setzen. Ähnliches kann für ImageButton gemacht werden

Verwandte Themen