Changement ViewPager animation durée en glissant par programmation
Je vais changer les glisser avec le code suivant:
viewPager.setCurrentItem(index++, true);
Mais il change trop vite. Est-il un moyen de régler manuellement la vitesse de l'animation?
- Pas sûr de ce que votre recherche ressemblait, mais jetez un oeil à cette réponse ici, sur DONC. Qui devrait être précisément ce que vous êtes après.
- En fait c'est tout à fait semblable à ma solution, bien que j'ai utilisé un facteur au lieu de la durée absolue (parce que dans un
ViewPager
la durée peut dépendre du nombre de pages que vous faites défiler).
Vous devez vous connecter pour publier un commentaire.
J'ai voulu faire moi-même et ont obtenu une solution (à l'aide de la réflexion, cependant).
je n'ai pas encore testé mais il devrait travail ou besoin d'un minimum de modifications.Testé sur Galaxy Nexus JB 4.2.1. Vous devez utiliser unViewPagerCustomDuration
dans votre XML au lieu deViewPager
, et ensuite vous pouvez faire ceci:ViewPagerCustomDuration.java
:ScrollerCustomDuration.java
:Espère que cela aide quelqu'un!
ViewPager
.IllegalArgumentException
.Interpolator interp = new LinearInterpolator(); interpolator.set(null, interp); mScroller = new ScrollerCustomDuration(getContext(), interp);
catch
déclaration deViewPagerCustomDuration
? si une exception est levéemScroller
devient nul et puis l'appel desetScrollDurationFactor
jetteNullPointerException
catch
déclaration est nécessaire pour checked exceptions w/Java lors de l'utilisation de la réflexion.mScroller
est initialisé dansViewPager
donc il n'est pas null. Mais vous avez raison, il serait préférable de prendre seulement certaines exceptions et poignéemScroller
de ne pas être mis à jour, de sorte que dans le cas où le privé, les changements de l'API à un certain point, le code s'exécute toujours au lieu de s'écraser. Hésitez pas à mettre à jour.J'ai trouvé une meilleure solution, basée sur @df778899 réponse et la
Android ValueAnimator API. Il fonctionne très bien sans réflexion et est très flexible.
Aussi il n'est pas nécessaire pour la fabrication personnalisée ViewPager et de la mettre en android.de soutien.v4.voir le forfait.
Voici un exemple:
Mise à JOUR:
Viens de vérifier si cette solution peut être utilisée pour faire glisser plusieurs pages à la fois (par exemple, si la première page devrait être montré après la dernière). C'est un peu modifié le code pour gérer spécifié nombre de pages:
Meilleure solution est de simplement accéder aux champs privés par la création de la classe dans le paquet de soutien. MODIFIER Cela est lié à la
MAX_SETTLE_DURATION
de 600ms, défini par leViewPager
classe.Vous pouvez, bien sûr, puis ajouter un attribut personnalisé donc cela peut être réglée via XML.
setCurrentItemInternal()
méthode ne possède pas de modificateur d'accès dans la bibliothèque de code source, donc sa visibilité est le même package. Donc, si vous mettez votre enfant en classe de paquet que vous pouvez légalement remplacer ce type de méthodesVoici mon code utilisé dans Librera Lecteur
Après perdre toute ma journée, j'ai trouvé une solution offscreenPageLimit à la totale pas de. de la page.
Afin de garder une longueur constante ViewPager rouleaux lisses, setOffScreenLimit(page.la longueur) conserve tous les points de vue dans la mémoire. Cependant, cela pose un problème pour toutes les animations qui implique l'appel de la Vue.requestLayout fonction (par exemple, une animation qui consiste à faire des changements à la marge ou de limites). Il rend vraiment très lent (comme par Romain Guy), parce que l'ensemble des points de vue qui est dans la mémoire seront invalidés. J'ai donc essayé quelques façons différentes de faire les choses en douceur, mais primordial requestLayout et d'autres invalider des méthodes de causer de nombreux autres problèmes.
Un bon compromis pour modifier dynamiquement l'écran hors tension limite de sorte que la plupart des manuscrits entre les pages seront très lisse tout en veillant à ce que la totalité de la page d'animations en douceur en éliminant les points de vue lorsque l'utilisateur. Cela fonctionne vraiment bien quand vous avez seulement 1 ou 2 points de vue qui ont à faire d'autres vues de la mémoire.
***Utilisez cette fonction lorsque aucune solution fonctionne parce que par la mise en offeset limite de u va charger tous les fragments dans le même temps