EDIT: Das eigentliche Problem war, dass meine LinearLayout
wurde in ein anderes Layout gewickelt, die das falsche Verhalten verursacht. Die akzeptierte Antwort von Sanvywell hat ein besseres, vollständigeres Beispiel dafür, wie man eine Farbe unter Durchsicht zeichnet, als das Code-Snippet, das ich in der Frage bereitgestellt habe.Hinzufügen eines farbigen Hintergrunds mit Text/Symbol unter Swiped-Zeile bei der Verwendung von Android RecyclerView
Jetzt, wo RecyclerView Widget native Unterstützung für Zeile hat mit Hilfe von ItemTouchHelper Klasse klauen, bin ich versucht, es in einer App zu verwenden, in denen Zeilen in ähnlicher Weise auf die Google-App Posteingang verhalten wird. Das bedeutet, dass Wischen nach links eine Aktion ausführt und Wischen nach rechts eine andere ausführt.
Die Implementierung der Aktionen selbst war einfach mit ItemTouchHelper.SimpleCallback 's onSwiped
Methode. Ich konnte jedoch keine einfache Methode zum Festlegen von Farbe und Symbol unter der Ansicht finden, die gerade übertragen wird (wie in der Google Mail-App).
, das zu tun, versuche ich ItemTouchHelper.SimpleCallback ‚s onChildDraw
Methode wie folgt außer Kraft zu setzen:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
RecyclerViewAdapter.ViewHolder vh = (RecyclerViewAdapter.ViewHolder) viewHolder;
LinearLayout ll = vh.linearLayout;
Paint p = new Paint();
if(dX > 0) {
p.setARGB(255, 255, 0, 0);
} else {
p.setARGB(255, 0, 255, 0);
}
c.drawRect(ll.getLeft(), ll.getTop(), ll.getRight(), ll.getBottom(), p);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
die Wischrichtung von dX ermitteln und die entsprechenden Farbwerkseinstellung als gedacht, aber die Koordinaten ich von die ViewHolder
entsprechen immer der Stelle, an der die erste LinearLayout
aufgeblasen wurde.
Wie bekomme ich die richtigen Koordinaten für die LinearLayout
, die in der aktuell ausgewählten Zeile ist? Gibt es einen einfacheren Weg (um onChildDraw
nicht zu überschreiben), um die Hintergrundfarbe und das Symbol zu setzen?
sollten Sie vermeiden, im Allgemeinen Objekte in OnDraw Methoden instanziieren. Dies kann sich auf die Leistung auswirken, da OnDraw-Methoden oft aufgerufen werden. Sie sollten das Paint-Objekt wahrscheinlich zwischenspeichern, anstatt es jedes Mal neu zu erstellen. Aus der Dokumentation: "Das Erstellen von Objekten im Voraus ist eine wichtige Optimierung. Ansichten werden sehr häufig neu gezeichnet, und viele Zeichnungsobjekte erfordern eine aufwendige Initialisierung. Das Erstellen von Zeichnungsobjekten in Ihrer onDraw() -Methode reduziert die Leistung erheblich und kann dazu führen, dass Ihre Benutzeroberfläche träge erscheint." http://developer.android.com/training/custom-views/custom-drawing.html –
Der Code für dX> 0 muss den Wert "getLeft()" zu dX hinzufügen, um das Auffüllen des RecyclerView c.drawRect (((float) itemView.getLeft(), (Gleitkomma) itemView.getTop(), itemView.getLeft() + dX, (Gleitkomma) itemView.getBottom(), p); –
@Sanvywell Wäre es nicht eine gute Idee, super.onChildDraw zuerst zu nennen? –