134 votes

Android : ViewPager vertical

Y a-t-il un moyen de faire un ViewPager qui ne défile pas horizontalement, mais verticalement !

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

229voto

Brett Points 191

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 :

VerticalViewPager demo

4 votes

@Der Golem comment utiliser la mise en page pour cela ?

0 votes

Quelle est la question exacte ? Au fait, je n'ai pas publié la réponse, j'ai juste ajouté l'image en question.

0 votes

Cet exemple ne poserait-il pas des problèmes lorsque la largeur n'est pas fixée à la largeur du parent ?

21voto

Kulai Points 227

J'ai une solution qui fonctionne pour moi en deux étapes.

  1. 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)
  2. Rotation ViewPager la vue de 90 degrés :

    objViewPager.setRotation(90)

Cela fonctionne comme un charme, du moins pour mes besoins.

4 votes

Cette solution fonctionne, MAIS vous devez toujours glisser horizontalement alors que le viewPager défile maintenant verticalement.

0 votes

@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) ;

1 votes

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 :-/

18voto

micyunu Points 673

Implémentation d'un pager à vue verticale par Antoine Merle :

https://github.com/castorflex/VerticalViewPager

7voto

Vasily Sochinsky Points 1350

Il existe une nouvelle implémentation d'un ViewPager vertical :

Annonce : https://plus.google.com/107777704046743444096/posts/1FTJfrvnY8w

Code : https://github.com/LambergaR/VerticalViewPager/

3voto

fiddler Points 7421

2 votes

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.

0 votes

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.

2 votes

Bonjour, avez-vous réussi à faire le viewpager vertical ? Merci.

Prograide.com

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.

Powered by:

X