Gibt es eine Möglichkeit, die Bildlaufgeschwindigkeit mit dem Viewpager-Adapter in Android zu verlangsamen?
Weißt du, ich habe mir diesen Code angesehen. Ich kann nicht herausfinden, was ich falsch mache.
try{
Field mScroller = mPager.getClass().getDeclaredField("mScroller");
mScroller.setAccessible(true);
Scroller scroll = new Scroller(cxt);
Field scrollDuration = scroll.getClass().getDeclaredField("mDuration");
scrollDuration.setAccessible(true);
scrollDuration.set(scroll, 1000);
mScroller.set(mPager, scroll);
}catch (Exception e){
Toast.makeText(cxt, "something happened", Toast.LENGTH_LONG).show();
}
Es ändert sich nichts, aber es treten keine Ausnahmen auf?
child.setNestedScrollingEnabled(false);
arbeitete für michAntworten:
Ich habe mit HighFlyers Code begonnen, der zwar das mScroller-Feld geändert hat (was ein guter Anfang ist), aber nicht dazu beigetragen hat, die Dauer des Bildlaufs zu verlängern, da ViewPager die Dauer explizit an den mScroller übergibt, wenn er zum Bildlauf aufgefordert wird.
Das Erweitern von ViewPager hat nicht funktioniert, da die wichtige Methode (oothScrollTo) nicht überschrieben werden kann.
Am Ende habe ich das Problem behoben, indem ich Scroller mit folgendem Code erweitert habe:
Und so verwenden:
Grundsätzlich habe ich die Dauer auf 5 Sekunden fest codiert und meinen ViewPager dazu gebracht, sie zu verwenden.
Hoffe das hilft.
quelle
scroller.setFixedDuration(5000);
ein Fehler auftritt? Es heißt "Die Methode setFixedDuration (int) ist undefiniert"Ich wollte es selbst tun und habe eine Lösung gefunden (allerdings mit Reflexion). Es ähnelt der akzeptierten Lösung, verwendet jedoch denselben Interpolator und ändert die Dauer nur basierend auf einem Faktor. Sie müssen ein
ViewPagerCustomDuration
in Ihrem XML anstelle von verwendenViewPager
, und dann können Sie dies tun:ViewPagerCustomDuration.java
::ScrollerCustomDuration.java
::Hoffe das hilft jemandem!
quelle
Ich habe eine bessere Lösung gefunden, basierend auf der Antwort @ df778899 und der Android ValueAnimator-API . Es funktioniert gut ohne Reflexion und ist sehr flexibel. Außerdem müssen Sie keinen benutzerdefinierten ViewPager erstellen und in das Paket android.support.v4.view einfügen. Hier ist ein Beispiel:
quelle
startFakeDrag
undendFakeDrag
die dazu gedacht sind, mehr zu tun, als imViewPager
Lieferumfang enthalten ist. Dies funktioniert gut für mich und ist genau das, wonach ich gesucht habeanimatePagerTransition(final boolean forward
Methode? Darüber bin ich verwirrt. Nennen Sie es in einer derViewPager.OnPageChangeListener
Schnittstellenmethoden? Oder irgendwo anders?Wie Sie sehen in ViewPager Quellen, die Dauer von mScroller Objekt Fling gesteuert. In der Dokumentation können wir lesen:
Wenn Sie also die Geschwindigkeit steuern möchten, können Sie das mScroller-Objekt über die Reflexion ändern.
Sie sollten so etwas schreiben:
quelle
Dies ist keine perfekte Lösung, Sie können die Geschwindigkeit nicht verlangsamen, weil es eine ist
int
. Aber für mich ist es langsam genug und ich muss keine Reflexion verwenden.Beachten Sie das Paket, in dem sich die Klasse befindet.
smoothScrollTo
hat Paketsichtbarkeit.quelle
Notice the package where the class is
.package-local
fields
/ verwendenmethods
, wenn Sie Android Studio nur glauben lassen, dass Sie dasselbe Paket verwenden? Bin ich der einzige, der etwas riechtsealing violation
?Die fakeDrag-Methoden in ViewPager scheinen eine alternative Lösung zu bieten.
Zum Beispiel wird von Seite 0 bis 1 gewechselt:
(Das
count * count
ist nur da, um das Ziehen zu beschleunigen)quelle
Ich habe benutzt
Hier ist das Beispiel:
quelle
Basierend auf der akzeptierten Lösung habe ich eine Kotlin-Klasse mit der Erweiterung für View Pager erstellt. Genießen! :) :)
quelle
Hier ist eine Antwort mit einem ganz anderen Ansatz. Jemand könnte sagen, dass dies ein hackiges Gefühl hat; Es wird jedoch keine Reflexion verwendet, und ich würde argumentieren, dass es immer funktionieren wird.
Wir finden den folgenden Code darin
ViewPager.smoothScrollTo
:Es berechnet die Dauer anhand einiger Dinge. Sehen Sie etwas, das wir kontrollieren können?
mAdapter.getPageWidth
. Lassen Sie uns ViewPager.OnPageChangeListener in unserem Adapter implementieren . Wir werden erkennen, wann der ViewPager einen Bildlauf durchführt, und einen falschen Wert für die Breite angeben . Wenn ich die Dauer sein sollk*100
, dann will ich wieder1.0/(k-1)
fürgetPageWidth
. Das Folgende ist Kotlin Impl dieses Teils des Adapters, der die Dauer in 400 umwandelt:Vergessen Sie nicht, den Adapter als OnPageChangedListener hinzuzufügen.
In meinem speziellen Fall kann davon ausgegangen werden, dass der Benutzer nicht wischen kann, um zwischen Seiten zu ziehen. Wenn Sie das Abwickeln nach einem Ziehen unterstützen müssen, müssen Sie bei Ihrer Berechnung etwas mehr tun.
Ein Nachteil ist, dass dies von dem fest
100
codierten Wert für die Basisdauer in ViewPager abhängt. Wenn sich dies ändert, ändert sich Ihre Dauer mit diesem Ansatz.quelle
Ich wollte das gleiche Problem wie Sie alle lösen und dies ist meine Lösung für das gleiche Problem, aber ich denke, auf diese Weise ist die Lösung flexibler, da Sie die Dauer nach Belieben ändern und auch die Interpolation der Werte nach Wunsch ändern können verschiedene visuelle Effekte zu erzielen. Meine Lösung wischt von Seite "1" zu Seite "2", also nur in zunehmenden Positionen, kann aber leicht geändert werden, um in abnehmende Positionen zu wechseln, indem "animProgress - lastFakeDrag" anstelle von "lastFakeDrag - animProgress" ausgeführt wird. Ich denke, dies ist die flexibelste Lösung für die Ausführung dieser Aufgabe.
quelle