Y a-t-il un moyen de faire un ViewPager
qui ne défile pas horizontalement, mais verticalement !
@Der Golem comment utiliser la mise en page pour cela ?
Y a-t-il un moyen de faire un ViewPager
qui ne défile pas horizontalement, mais verticalement !
Vous pouvez utiliser un ViewPager.PageTransformer pour donner l'illusion d'une verticale ViewPager
. Pour obtenir un défilement avec un déplacement vertical au lieu d'un déplacement horizontal, vous devrez remplacer la commande ViewPager
Les événements tactiles par défaut de l'utilisateur et l'échange des coordonnées de l'utilisateur. MotionEvent
avant de les manipuler, par exemple :
/**
* Uses a combination of a PageTransformer and swapping X & Y coordinates
* of touch events to create the illusion of a vertically scrolling ViewPager.
*
* Requires API 11+
*
*/
public class VerticalViewPager extends ViewPager {
public VerticalViewPager(Context context) {
super(context);
init();
}
public VerticalViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
// The majority of the magic happens here
setPageTransformer(true, new VerticalPageTransformer());
// The easiest way to get rid of the overscroll drawing that happens on the left and right
setOverScrollMode(OVER_SCROLL_NEVER);
}
private class VerticalPageTransformer implements ViewPager.PageTransformer {
@Override
public void transformPage(View view, float position) {
if (position < -1) { // [-Infinity,-1)
// This page is way off-screen to the left.
view.setAlpha(0);
} else if (position <= 1) { // [-1,1]
view.setAlpha(1);
// Counteract the default slide transition
view.setTranslationX(view.getWidth() * -position);
//set Y position to swipe in from top
float yPosition = position * view.getHeight();
view.setTranslationY(yPosition);
} else { // (1,+Infinity]
// This page is way off-screen to the right.
view.setAlpha(0);
}
}
}
/**
* Swaps the X and Y coordinates of your touch event.
*/
private MotionEvent swapXY(MotionEvent ev) {
float width = getWidth();
float height = getHeight();
float newX = (ev.getY() / height) * width;
float newY = (ev.getX() / width) * height;
ev.setLocation(newX, newY);
return ev;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev){
boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
swapXY(ev); // return touch coordinates to original reference frame for any child views
return intercepted;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return super.onTouchEvent(swapXY(ev));
}
}
Bien entendu, vous pouvez modifier ces paramètres comme bon vous semble. Au final, ça ressemble à ça :
Quelle est la question exacte ? Au fait, je n'ai pas publié la réponse, j'ai juste ajouté l'image en question.
Cet exemple ne poserait-il pas des problèmes lorsque la largeur n'est pas fixée à la largeur du parent ?
J'ai une solution qui fonctionne pour moi en deux étapes.
onInstantiateItem()
de PagerAdapter
créez la vue et faites-la pivoter de -90 :
view.setRotation(-90f)
Si vous utilisez FragmentPagerAdapter
alors :
objFragment.getView().setRotation(-90)
Rotation ViewPager
la vue de 90 degrés :
objViewPager.setRotation(90)
Cela fonctionne comme un charme, du moins pour mes besoins.
Cette solution fonctionne, MAIS vous devez toujours glisser horizontalement alors que le viewPager défile maintenant verticalement.
@Kulai Je ne comprends pas bien ce qu'il faut faire ici, pouvez-vous m'expliquer un peu ? D'après ce que j'ai compris, nous avons un objet public instantiateItem(ViewGroup container, int position), ici nous devons faire container.setRotation(-90f) ;
Cela fonctionne comme un charme ! Cependant, la vue est coupée dans la partie supérieure et inférieure, et je n'arrive pas à comprendre pourquoi :-/
Il existe une nouvelle implémentation d'un ViewPager vertical :
Annonce : https://plus.google.com/107777704046743444096/posts/1FTJfrvnY8w
Regardez ça : https://github.com/JakeWharton/Android-DirectionalViewPager
Ou la question suivante peut vous aider : Vertical "Gridview avec pages" ou "Viewpager".
Il faut garder à l'esprit que le DirectionalViewPager
n'a pas été mis à jour depuis un certain temps et, par conséquent, il lui manque certaines des nouvelles fonctionnalités de l'interface utilisateur. ViewPager
dans la bibliothèque de support ; c'est-à-dire setPageMargin(int)
. En général, cela devrait faire l'affaire. Et si ce n'est pas le cas, il n'est pas trop difficile de récupérer le code source de ViewPager
et échanger toute la logique x/y et largeur/hauteur.
J'ai déjà pris en compte la DirectionalViewPager
mais, comme l'a dit MH, il n'est pas mis à jour (son développeur le considère comme DEPRECATED) ! !! C'est incroyable que les développeurs d'Android n'aient pas fourni à la communauté une version verticale de l'application. ViewPager
mais uniquement dans le sens horizontal. Je suis plus novice sur Android, je développe ma verticale ViewPager
le remplacement de x/y n'est pas si facile pour moi je préférerais une solution déjà construite de toute façon, merci.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Il existe une nouvelle implémentation open source non officielle d'un ViewPager vertical : Annonce : plus.google.com/107777704046743444096/posts/1FTJfrvnY8w Code : github.com/LambergaR/VerticalViewPager
0 votes
Implémentation d'un pager à vue verticale par Antoine Merle : github.com/castorflex/VerticalViewPager
0 votes
Il existe une nouvelle implémentation basée sur la bibliothèque de support 19 : github.com/castorflex/VerticalViewPager
0 votes
Ce n'est pas la même chose que github.com/castorflex/VerticalViewPager malgré un nom similaire.
1 votes
Il existe un contrôle appelé ViewPager2 voir ici pour la démo stackoverflow.com/a/54643817/7666442