Android: Synchronisierte Bildlauf von zwei verschiedenen Ansichten
Ich habe ein heikles problem im Zusammenhang mit der synchronisierte Bildlauf von zwei
verschiedene Ansichten.
Ich habe meine eigenen grid-Ansicht widget, welches "sticky" Ansichten zu
die Links und oben, die nur in eine Richtung mit dem raster. Denken Sie an eine
Kalender, wo Sie mal an der Spitze, Termine, Links, und, wenn
Blättern Sie horizontal durch die Zeit, das Datum anzeigen soll bleiben,
und wenn Sie scrollen Sie vertikal durch die Termine, die Zeit anzeigen soll
Aufenthalt stellen.
Das raster selbst ist implementiert mithilfe einer geschachtelten horizontale scrollview in
eine vertikale scrollview. Das Gitter funktioniert Super, also kein problem.
Da die klebrige Ansichten nicht in das aktuelle Gitter habe ich überschrieben
onScrollChanged im raster scrollviews und programmgesteuert aufrufen
scrollTo auf dem klebrigen Blick, wenn der Benutzer scrollt das grid.
Funktioniert wie erwartet, außer, dass es einen leichten zeitlichen Versatz als
wenn die zwei verschiedenen Ansichten starten, scrollen und endet scrollen. Es
macht Sinn, wenn man bedenkt, dass das scrollen wahrscheinlich ausgeführt wird
Linear von den UI-thread nehme ich an..
Alle Ansichten sind scroll-Ansichten, und ich habe smooth-scrolling aktiviert
und verwendet smoothScrollTo, etc, anstatt zu versuchen, das zu verbessern, aber es ist
das gleiche problem dennoch. Das problem ist besonders deutlich auf
bei größeren Bildschirmen wie dem Samsung Galaxy Tab, in der Erwägung, dass es kaum
Auffällig auf small-medium-screen-Geräten.
Jede Hilfe ist willkommen! Wenn es eine einfache Lösung, Super..wenn es bedeutet,
neues design (das entspricht den klebrigen Blick Anwendungsfall oben), dann soll es so sein.
Code auslösen prog. scrollen, das gleiche gilt für die horizontale
@Override
protected void onScrollChanged(int x, int y, int oldx, int oldy) {
mListener.onScrollY(y);
super.onScrollChanged(x, y, oldx, oldy);
}
//which leads to,
//Handle vertical scroll
public void onScrollY(final int y) {
mCurrentY = y;
mVerticalScroll.smoothScrollTo(0, y);
}
XML-layouts unten, wenn das helfen
Dem eigentlichen Gitter, die eine horizontale scroll-view, eingehüllt in einen vertikalen scroll-Ansicht und der Gitter-Elemente Hinzugefügt werden vertikal in der geschachtelten linearlayout
>
< com.....VerticalScrollView
android:id="@+id/gridscroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@id/timescroll"
android:layout_toRightOf="@id/vertscroll"
android:layout_alignTop="@id/vertscroll"
android:layout_marginLeft="2dp" android:scrollbars="none"
android:fadingEdge="none">
< com....HorizScrollView
android:id="@+id/horizscroll"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:fadingEdge="none">
< LinearLayout android:id="@+id/grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
< /LinearLayout>
< /com.....HorizScrollView>
< /com.....VerticalScrollView>
Die horizontale sticky Ansicht
< com.....GridTimeScrollView
android:id="@+id/timescroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:fadingEdge="none">
< LinearLayout android:id="@+id/timelist"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" />
< /com.....GridTimeScrollView>
Die vertikale sticky Ansicht
< com....GridVertListScrollView
android:id="@+id/vertscroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollbars="none"
android:fadingEdge="none">
< LinearLayout
android:id="@+id/vertitemlist"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" />
< /com.....GridVertListScrollView>
InformationsquelleAutor Andreas | 2011-01-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst, ich denke, Sie sollten sich dessen bewusst sein: ScrollView Innen ScrollView
Kurz: mit scrollviews innen scrollviews ist eine schlechte Sache, die Pausen viele Optimierungen.
Nun, auf Ihre Frage.
Ich habe ein ähnliches Bedürfnis, das was du beschrieben hast. Ich landete Implementierung einer benutzerdefinierten Ansicht und seine
onDraw
Methode. Dies war zum Teil, weil ich zeichnen war etwas, das nicht trivial und können Sie nicht haben, um es zu tun.Trotzdem glaube ich, dass Ihre beste option ist:
scrollBy
in jeder der Ansichten scrollen. Wenn Sie dies tun, wenn Sie möchten, dass die Ansicht von oben zu scrollen, nur horizontal, übergeben Sie 0 als die vertikale scroll-Abstand.computeScroll()
Methode und aktualisieren Sie die Bildlauf-in jedem Kind Aussicht.Überprüfen Sie diese Beispiel zu wissen, wie es zu implementieren. Ich entschuldige mich, ich werde versuchen zu posten, ein besseres Beispiel, wenn möglich.Check my code unten... es ist einfacher 🙂Update: Beispielcode
Nein. Ich denke, dass Ihre "sync" - problem ist, denn wenn man die Informationen über die schriftrolle, die bereits verarbeitet wurde, indem Sie eine Ansicht und klicken Sie, um die anderen zu navigieren, wie die erste. Diese Möglichkeit, eine Ansicht scrollt und die anderen tun werden, die entsprechende schriftrolle in den nächsten Zyklus. Mit meinem Ansatz, alle Ansichten scrollen an der gleichen Zeit. Und Sie werden nicht dieses problem haben.
InformationsquelleAutor Pedro Loureiro
Nicht verwenden smoothScrollTo, verwenden Sie scrollTo statt. smoothScrollTo animieren eine schriftrolle aus seiner aktuellen position zu der position, die Sie wollen, weil Sie wollen, dass Sie synchronisiert werden, Sie wollen, dass die anderen scrollview sofort genau dort, wo die anderen scrollview ist, scrollTo funktioniert.
InformationsquelleAutor jsonfry
Blick auf die Antworten. Warum gehst du nicht behandeln Sie es mit einem OnTouch-Listener. Wenn das touch-Ereignis VERSCHIEBEN Sie Sie anrufen.
mit dem Wert von getVerticalScroll auf Ihren anderen ScrollView. Das ist ziemlich einfach. Und true zurückgeben, so TouchEvents behandelt werden weitere.
Hier ist, was es Aussehen könnte
Einfach Recht?
Nicht sicher, ob es genau das, was Sie wollte. Aber könnten Sie erläutern, was genau Sie versuchen zu erreichen. Nicht im Sinne von layout, aber in der Praxis..was ist der Punkt von deinem UI?
InformationsquelleAutor Loïc Faure-Lacroix