5

Ich bin auf einer App arbeiten, die ein Dual-Fenster-Layout auf größere Geräten ähnlich wie verwendet, was detaillierte here. Eine Zusammenfassung des Layouts; Ein Bereich enthält eine Liste von Optionen, während der andere detaillierte Informationen zu einer Option anzeigt, die im anderen Bereich ausgewählt wurde.Addiert man die Auswirkungen eines RippleDrawable und einen StateListDrawable zu einem RecyclerView

Gerade jetzt, wenn eine Option ausgewählt ist, gibt es den Ripple-Effekt, der bei der Auswahl anderer Elemente (Schaltflächen, Kontrollkästchen usw.) zu sehen ist. Nach Abschluss der Animation kehrt das Element zur vorherigen Farbe zurück. Ich möchte das Highlight aus der Ripple behalten, nachdem die Animation abgeschlossen ist und ich habe Probleme herauszufinden, wie dies zu erreichen ist.

So sieht mein Ripple-Hintergrund derzeit aus. Der focus Selektor tut nichts - konnte nicht herausfinden, wie man den Elementen den Fokus gibt. Ich habe auch versucht, einen selected Selektor zu verwenden, aber das geschieht sofort und überschreibt die Welligkeit.

<?xml version="1.0" encoding="utf-8"?> 
    <ripple xmlns:android="http://schemas.android.com/apk/res/android" 
    android:color="?android:colorAccent"> 
    <item android:id="@android:id/mask" 
     android:drawable="@android:color/black" /> 
    <item> 
     <selector> 
      <item android:state_focused="true" 
       android:drawable="@color/accent" /> 
     </selector> 
    </item> 
</ripple> 

, erneut auf, ist meine Frage: Ist es möglich, eine sich allmählich ausbreitende Wirkung sowohl durch einen markierten Bereich, gefolgt zu haben, und wenn ja, wie?

+0

eine hacky Lösung (das habe ich versucht und Arbeit) wird Ihr Artikel Hintergrund festlegen zu einem 'Selector' mit einem Standard-Item von Ripple (ohne seinen Selektor) und mit einem 'checked'-Zustand. Klicken Sie dann auf "postDelayed", um den Status Ihrer Ansicht auf checked zu setzen (Sie müssen "Checkable" implementieren). etwas weniger hacky zu versuchen - da 'RippleDrawable' ist nur ein' LayerDrawable', versuchen überschreiben 'onStateChange' zu ​​erkennen gedrückten Zustand, und ändern Sie dann den Hintergrund der" Inhalt "Ebene auf etwas anderes (manuell), so dass, wenn Die Animation ist fertig, Sie sehen die ausgewählte Farbe. – ahmedre

Antwort

1

Dies hat die Ripple-Animation für mich bei der Auswahl erhalten.

Mit Ihrer Ripple ziehbar Verwendung:

<?xml version="1.0" encoding="utf-8"?> 
    <item> 
     <selector> 
      <item android:state_selected="true" 
        android:drawable="@color/selected_color" /> 
      <item android:drawable="@color/normal_color" /> 
     </selector> 
    </item> 
</ripple> 

auf Ihrem Adapter, rufen setHasStableIds(true) und implementieren getItemId eindeutige Werte zurückgeben Ihre Zeilen darstellen.

Wenn ein Element ausgewählt ist, zu tun:

ViewHolder oldViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(oldItemId); 
oldViewHolder.itemView.setSelected(false); 

ViewHolder newViewHolder = (ViewHolder) recyclerView.findViewHolderForItemId(newItemId); 
newViewHolder.itemView.setSelected(true); 

auch in Ihrem Adapter:

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int position) { 

    ... 

    viewHolder.itemView.setSelected(isSelected); 

    ... 
} 

Auf einer Seite zur Kenntnis, wird der fokussierte Selektor für die Hervorhebung Navigation auf Geräte verwendet, die ein d verwenden -pad wie TV und einige ältere Telefone.

0

Ich hatte auch viel damit zu kämpfen. Ich landete mit einem <layer-list/>

tun Sie können meine Lösung in einer Antwort auf eine Frage sehr ähnlich wie bei Ihnen hier sehen: https://stackoverflow.com/a/31335539/844206