Existe-t-il un moyen de faire un ViewPager
qui ne défile pas horizontalement, mais verticalement?!
android
android-viewpager
user1709805
la source
la source
Réponses:
Vous pouvez utiliser un ViewPager.PageTransformer pour donner l'illusion d'une verticale
ViewPager
. Pour obtenir un défilement avec un glissement vertical au lieu d'un glissement horizontal, vous devrez remplacerViewPager
les événements tactiles par défaut et permuter les coordonnées deMotionEvent
s avant de les gérer, par exemple:Bien sûr, vous pouvez modifier ces paramètres comme bon vous semble. Finit par ressembler à ceci:
la source
J'ai une solution qui fonctionne pour moi en deux étapes.
onInstantiateItem()
dePagerAdapter
, créez la vue et faites-la pivoter de -90:Si vous utilisez
FragmentPagerAdapter
, alors:Faire pivoter la
ViewPager
vue de 90 degrés:Fonctionne comme un charme au moins pour mon exigence.
la source
Vue verticalePager
Les autres réponses ici semblaient toutes avoir des problèmes avec elles. Même les projets open source recommandés ne fusionnaient pas les demandes d'extraction récentes avec des corrections de bogues. Ensuite, j'ai trouvé
VerticalViewPager
de Google qu'ils utilisaient une application DeskClock. Je fais beaucoup plus confiance à l'utilisation de la mise en œuvre de Google qu'aux autres réponses qui flottent ici. (La version de Google est similaire à la réponse actuelle la plus votée, mais plus complète.)Exemple complet
Cet exemple est presque exactement le même que mon exemple de base ViewPager , avec quelques modifications mineures pour utiliser la
VerticalViewPager
classe.XML
Ajoutez les mises en page xml pour l'activité principale et pour chaque page (fragment). Notez que nous utilisons
VerticalViewPager
plutôt que la normeViewPager
. Je vais inclure le code ci-dessous.activity_main.xml
fragment_one.xml
Code
Le code pour le
VerticalViewPager
n'est pas le mien. Il s'agit simplement d'une version allégée (sans commentaires) du code source de Google. Découvrez celui-ci pour la version la plus à jour. Les commentaires sont également utiles pour comprendre ce qui se passe.VerticalViewPager.java
MainActivity.java
J'ai seulement échangé
VerticalViewPager
pourViewPager
.Fini
Vous devriez pouvoir exécuter l'application et voir le résultat dans l'animation ci-dessus.
Voir également
la source
Pour quelqu'un qui a du mal à faire fonctionner ViewPager vertical à l'horizontale, faites simplement les choses suivantes:
Vue verticalePager
Vue horizontalePager
la source
Une légère extension cette réponse m'a aidé à réaliser mon exigence (Vertical View Pager pour animer similaire comme dans Inshorts - News en 60 mots )
J'espère que cela pourra être utile à quelqu'un d'autre.
la source
Il y a quelques projets open source qui prétendent faire cela. Les voici:
Ceux-ci ont été marqués comme obsolètes par leurs auteurs:
Et encore une chose:
deskclock
application, mais il ne semble pas être officiellement pris en charge car je ne trouve pas de documentation à ce sujet.la source
Vérifiez ceci: https://github.com/JakeWharton/Android-DirectionalViewPager
Ou la question suivante peut vous aider: Vertical "Gridview avec pages" ou "Viewpager"
la source
DirectionalViewPager
n'a pas été mis à jour depuis un certain temps et qu'il manque donc certaines des nouvelles fonctionnalités de laViewPager
dans la bibliothèque de support; iesetPageMargin(int)
. En général, il devrait faire le travail. Et sinon, il n'est pas trop difficile de récupérer le code sourceViewPager
et de remplacer toutes les logiques x / y et largeur / hauteur.DirectionalViewPager
mais, comme MH l'a dit, il n'est pas mis à jour (son développeur le considère comme DÉPRECÉ) !! C'est incroyable que les développeurs AndroidViewPager
n'aient pas fourni à la communauté un vertical , mais seulement un horizon. Je suis plus récent sur Android, développer monViewPager
échange vertical x / y n'est pas si facile pour moi .. je préférerais une solution déjà construite .. de toute façon, merciJuste une amélioration sur les réponses de @Brett et @ Salman666 pour transformer correctement les coordonnées (X, Y) en (Y, X) puisque les affichages de l'appareil sont rectangulaires:
...
...
Cependant, quelque chose doit encore être fait pour améliorer la réactivité de l'écran tactile. Le problème pourrait être lié à ce que @msdark a commenté sur la réponse de @ Salman666.
la source
true
dansonInterceptTouchEvent
et je l' ai aussi modifié les raccourcis clavier, de sorte que l' aide d' un DEPA il déclenche les boutons HAUT / BAS au lieu de gauche / droite: gist.github.com/zevektor/fbacf4f4f6c39fd6e409la source
Il y en a déjà un dans la source Android . Je l'ai cependant modifié pour qu'il fonctionne mieux:
la source
Un référentiel actuellement plus actif est lsjwzh / RecyclerViewPager .
RecyclerView
la source
Il s'agit d'une implémentation de ViewPager à défilement vertical. Fonctionne bien avec RecyclerView et ListView. guochong / VerticalViewPager .
utilisez ViewPager.PageTransformer pour faire défiler ViewPager verticalement et fournissez également un View.OnTouchListener pour gérer le conflit de défilement.
la source
Même moi, je faisais face au même problème en rendant ViewPager vertical en échangeant X et Y. Ce n'était pas du tout fluide.
C'est parce qu'il ne fonctionnait que lorsque l'angle de balayage était inférieur à 7,125 degrés = arctan (1/8) pendant l'interception et 14 degrés = arctan (1/4) pendant le toucher; comme original ViewPager horizontal un travail lorsque l'angle de balayage est inférieur à 26,565 degrés = arctan (1/2) pendant l'interception et 45 degrés = arctan (1) pendant le toucher.
C'est pourquoi j'ai copié le code d'Android support-core-ui et déplacé les valeurs vers des variables, que j'ai multipliées par réflexion.
Veuillez trouver le code et le README sur https://github.com/deepakmishra/verticalviewpager et VerticalViewPager sur https://github.com/deepakmishra/verticalviewpager/blob/master/app/src/main/java/com/viewpager/VerticalViewPager .Java
la source
la meilleure façon est de faire pivoter le visualiseur de 90 degrés et d'utiliser constraintLayout pour ajuster l'emplacement.
la source
J'ai fini par créer un nouveau DirectionalViewPager qui peut faire défiler verticalement ou horizontalement car toutes les solutions que j'ai vues ici ont des défauts:
Implémentations existantes de VerticalViewPager (par castorflex et LambergaR)
Astuce de transformation avec échange de coordonnées
VelocityTracker.computeCurrentVelocity
calcule toujours la vitesse avec l'axe X, probablement parce que cela utilise en interne un appel natif qui ignore l'échange de coordonnées.Afficher la rotation
la source