7

Dopo essere stato alla ricerca di un po 'non sono stato in grado di trovare una risposta a questo ...Android Ripple Effect sovrascritti da Stato Selected

ho una vista riciclatore con gli oggetti che una volta selezionato un fondo rosso e testo bianco (in precedenza lo sfondo è bianco e il testo è nero). Per fare questo sto usando un selettore.

Ho recentemente tentato di aggiungere un effetto di ripple a questo, ma a meno che non clicchi a lungo sull'elemento, lo sfondo dell'oggetto va dritto al rosso senza il ripple. Suppongo che questo sia dovuto al fatto che lo stato del selettore stato_selezionato sovrascrive il ripple su sate_pressed?

Qualcuno sa se c'è un modo per aggirare questo? Ecco il codice di selezione che uso:

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

Grazie in anticipo!

risposta

16

Per creare uno sfondo di selezione che ha un effetto a catena e mostra lo stato selezionato faccio la seguente:

Inizia definendo il vostro colore di evidenziazione, con un po 'di trasparenza:

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

probabilmente si desidera avere la compatibilità pre-lecca-lecca. Mettere un tipico selettore di vecchia scuola all'interno della cartella drawable:

  • drawable/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> 

E quindi aggiungere la seguente drawable strato interno cartella drawable-V21:

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

Ora è possibile utilizzare @drawable/selector_background per il proprio selettore.

+2

Per gli altri, quando si utilizza con i pulsanti, questo approccio elenco di livelli funziona, ma è necessario utilizzare state_activated – urSus

+0

Anche se l'ondulazione funziona perfettamente, la voce di elenco non rimane selezionata. – Suleiman19

+1

Funziona molto bene. Il colore dell'effetto a increspatura e il colore selezionato dovrebbero essere diversi in modo che l'utente possa vedere l'effetto a catena quando si seleziona l'elemento già selezionato. – hfann

0

Sarà meglio se si avvolgere la recyclerview vista elemento in FrameLayout e impostare Android: background = "? SelectableItemBackground" del FrameLayout e la disposizione del bambino di FrameLayout background = "@ drawable/sfondo"

sfondo.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"/> 

e poi deve disposizione bambino ha attributo android: duplicateParentState = "true"

0

quindi non ho un altro caso in cui ho dovuto usare il selettore pure come elenco dei livelli per quello

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

Questo ha funzionato, per il tuo bisogno, ciò che puoi fare, basta sostituire l'elemento in ripple con la forma dell'oggetto se non hai strati. Spero che questo aiuti