2013-11-01 14 views
5

Ich habe eine LinearLayout "Karte" mit einem ImageView und einem TextView. Ich möchte, dass die Karte hervorgehoben wird, wenn der Benutzer darauf klickt. Ein Beispiel finden Sie in http://www.youtube.com/watch?v=Yx1l9Y7GIk8&feature=share&t=15m17s.Blaue Markierung über einem ImageView, wenn der Benutzer darauf tippt

Dies ist leicht für die TextView durch Einstellung android:background="@drawable/blue_highlight". Im Folgenden finden Sie res/ziehbar/blue_highlight.xml:

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

Aber das ist nicht für die Imageview funktioniert, weil das Bild vor und der Hintergrund ist nicht sichtbar. Wie kann ich den Touch-Highlight-Effekt mit einer halbtransparenten Farbe für ein ImageView erzielen?

+2

Ich glaube, Sie können Ihre LinearLayout in FrameLayout setzen und Vordergrundattribut dafür festlegen. – Bracadabra

Antwort

12

Erstaunlicherweise hat FrameLayout das foreground Attribut, das dafür verwendet werden kann. Der Nachteil ist, dass Sie ein zusätzliches FrameLayout-Element hinzufügen müssen. Die Implementierung ist einfach. Bis Sie also die Möglichkeit haben, eine phantasievolle Bildverarbeitung zu implementieren (das Bild ein wenig zu kolorieren, die Hervorhebung zu übernehmen) und die Zeichen für den Zustand dynamisch zu erstellen, scheint dies gut genug zu sein.

Also in meinem Fall sei:

<FrameLayout 
    android:foreground="@drawable/blue_highlight_image" 
    > 
    <ImageView ...> 
</FrameLayout> 

@ ziehbar/blue_highlight_image verwendet einen neuen @ color/pressed_image Wert, der mit @ color/gedrückt ähnlich ist, aber einen Alphakanal hat, zum Beispiel: # 81CFEB -> # AA81CFEB.

Danke @Vang für den Vorschlag.

+1

Für die blaue Standardfarbe können Sie folgendes verwenden: '? Android: attr/selectableItemBackground'. –

+0

Das funktioniert großartig, und wie @aleb es erwähnt hat, habe ich Alpha 30% verwendet, um es als Highlight aussehen zu lassen (30% Alpha = 4D in Hex). – green0range

1

Sie sind auf dem richtigen Weg. Versuchen Sie, die Datei blue_highlight.xml als Zeichenfläche zu verwenden. Verwenden Sie stattdessen die Farben, die Sie anzeigen möchten, und definieren Sie ein zweites Zeichenelement, das dem Bild einen Farbfilter hinzufügt, wenn es hervorgehoben wird.

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" android:drawable="@drawable/yourdrawable_with_colorfilter"/> 
    <item android:state_pressed="true" android:drawable="@drawable/yourdrawable_with_colorfilter"/> 
    <item android:drawable="@drawable/your_drawable"/> 
</selector> 
+0

Danke. Könnte gut für statische Bilder arbeiten. Schwieriger zu implementieren, wenn die Bilder aus einer Datenbank stammen oder heruntergeladen werden. – aleb

+0

Sie haben Recht. Aber du hast das nicht erwähnt. Um dynamischer zu sein, können Sie den Selektor programmieren. [Hier] (http://stackoverflow.com/questions/4697528/replace-selector-images-programmatically) finden Sie ein gutes Beispiel (die akzeptierte Antwort). – Baschi

Verwandte Themen