7

Nachdem er eine Weile suchen gewesen Ich habe nicht in der Lage gewesen, eine Antwort auf diese Frage zu finden ...Android Ripple Effect Überschrieben von Selected Staat

ich einen Recycler Ansicht mit Elementen haben, die, wenn sie ausgewählt haben einen roten Hintergrund und weißer Text (vorher ist der Hintergrund weiß und der Text ist schwarz). Um dies zu tun, benutze ich einen Selektor.

Ich habe kürzlich versucht, einen Welleneffekt hinzuzufügen, aber wenn ich nicht lange auf das Element klicke, geht der Hintergrund des Elements direkt auf Rot ohne die Welligkeit. Ich gehe davon aus, dass dies der Fall ist, weil der Selektorstatus state_selected die Welligkeit von sate_pressed überschreibt?

Weiß jemand, ob es einen Weg um diese gibt? Hier ist der Selektor-Code, den ich verwende:

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

    <item> 
     <selector xmlns:android="http://schemas.android.com/apk/res/android" > 
      <item 
       android:drawable="@drawable/ripple" 
       android:state_pressed="true"/> 
      <item 
       android:drawable="@android:color/holo_red_dark" 
       android:state_selected="true"/> 
      <item android:drawable="@android:color/white"/> 
     </selector> 
    </item> 

</ripple> 

Vielen Dank im Voraus!

Antwort

16

Um einen Selektor Hintergrund zu erstellen, die eine sich allmählich ausbreitende Wirkung hat und zeigt ausgewählte Status ich folgendes tun:

Beginnen Sie mit Ihrem Highlight-Farbe definieren, mit einem gewissen Transparenz:

  • Werte/Colors.xml
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <color name="selector_color">#660000ff</color> 
</resources> 

Sie wollen wahrscheinlich Kompatibilität pre-Lutscher haben. Setzen Sie einen typischen Oldschool-Selektor innerhalb ziehbar Ordner:

  • ziehbar/selector_background.xml
<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@color/selector_color" android:state_pressed="true"/> 
    <item android:drawable="@color/selector_color" android:state_selected="true"/> 
    <item android:drawable="@android:color/transparent"/> 
</selector> 

Und dann fügen Sie die folgende Schicht ziehbar innen ziehbar-v21-Ordner:

  • dropable-v21/selector_background.xml
<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
     <selector> 
      <item android:state_selected="true" 
       android:drawable="@color/selector_color" /> 
      <item android:drawable="@android:color/transparent" /> 
     </selector> 
    </item> 
    <item> 
     <ripple android:color="@color/selector_color"> 
      <item android:id="@android:id/mask"> 
       <color android:color="@android:color/white" /> 
      </item> 
     </ripple> 
    </item> 
</layer-list> 

Jetzt können Sie @drawable/selector_background für Ihren Selektor verwenden.

+2

Für andere, wenn Sie mit Schaltflächen verwenden, funktioniert diese Layer-Liste Ansatz, aber Sie müssen State_activated verwenden – urSus

+0

Obwohl die Welligkeit einwandfrei funktioniert, bleibt das Listenelement nicht ausgewählt. – Suleiman19

+1

Das funktioniert sehr gut. Die Farbe des Ripple-Effekts und die ausgewählte Farbe sollten unterschiedlich sein, damit der Benutzer den Welleneffekt sehen kann, wenn er den bereits ausgewählten Gegenstand auswählt. – hfann

0

Es wird besser sein, wenn Sie Ihre recyclerview Artikel Ansicht in FrameLayout wickeln und legen android: Hintergrund = "selectableItemBackground" von FrameLayout und das Kind Layout FrameLayout background = "@ ziehbar/Hintergrund"

Hintergrund.

xml

<item android:drawable="@color/red" android:state_selected="true"/> 
<item android:drawable="@color/red" android:state_focused="true"/> 
<item android:drawable="@color/red" android:state_pressed="true"/> 
<item android:drawable="@color/white"/> 

Und dann muss Kind Layout hat Attribut android: duplicateParentState = "true"

0

So habe ich einen anderen Fall, in dem ich auch Wähler hatte zu verwenden als Schichtliste für diese

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true"> 
     <ripple xmlns:android="http://schemas.android.com/apk/res/android" 
       android:color="@color/colorRipple"> 
      <item> 
       <layer-list> 
        <item> 
         <shape android:shape="rectangle"> 
          <solid android:color="@color/grey_very_light" /> 
         </shape> 
        </item> 
        <!-- ripple color --> 
        <item android:bottom="1dp"> 
         <shape android:shape="rectangle"> 
          <solid android:color="@color/c_unread_notifications_item" /> 
         </shape> 
        </item> 

       </layer-list> 
      </item> 
     </ripple> 

    </item> 
    <item> 
     <ripple xmlns:android="http://schemas.android.com/apk/res/android" 
       android:color="@color/colorRipple"> 
      <item> 
       <!-- ripple color --> 
       <layer-list> 

        <item> 
         <shape android:shape="rectangle"> 
          <solid android:color="@color/grey_very_light" /> 
         </shape> 
        </item> 

        <item android:bottom="1dp"> 
         <shape android:shape="rectangle"> 
          <solid android:color="@color/white" /> 
         </shape> 
        </item> 

       </layer-list> 
      </item> 
     </ripple> 
    </item> 
</selector> 

Dies funktioniert, für Ihren Bedarf, was Sie tun können, ersetzen Sie einfach den Artikel unter Ripple mit Ihrer Artikelform, wenn Sie keine Schichten haben. Hoffen, das hilft