web-dev-qa-db-fra.com

Android scrollview horizontal se comporte comme l'iPhone (pagination)

J'ai un LinearLayout à l'intérieur d'un HorizontalScrollView. Le contenu n'est qu'une image. Lors du défilement, je dois obtenir le même comportement que celui obtenu lors de la définition de l'option de pagination sur un équivalent iPhone du HSW (le défilement de la liste doit s'arrêter à chaque page de la liste, ne pas continuer à se déplacer).

Comment cela se fait-il sous Android? Dois-je implémenter ces fonctionnalités moi-même ou il existe une propriété particulière à définir ou une sous-classe de HSV à implémenter?

29
Davide Vosti

Donc, ma solution est:

  1. Interceptez l'événement onTouch et calculez si la page doit passer à la suivante ou rester sur l'actuelle
  2. Hériter de HorizontalScrollView et remplacer la méthode computeScroll

La méthode computeScroll l'appelé pour déplacer la liste. Par défaut, je suppose qu'il est implémenté pour ralentir avec un certain rapport ... Comme je ne veux pas de ce mouvement, je le remplace simplement sans spécifier de corps.

Le code du gestionnaire d'événements est:

_scrollView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = _scrollView.getScrollX();
                float pagesCount = _horizontalBar.getChildCount();
                float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
                float currentPage = currentPosition/pageLengthInPx;

                Boolean isBehindHalfScreen =  currentPage-(int)currentPage > 0.5;

                float edgePosition = 0;
                if(isBehindHalfScreen)
                {
                    edgePosition = (int)(currentPage+1)*pageLengthInPx;
                }
                else
                {
                    edgePosition = (int)currentPage*pageLengthInPx;
                }

                _scrollView.scrollTo((int)edgePosition, 0);
            }

            return false;
        }
    });

Et dans mon hérité HorizontalScrollView

@Override
    public void  computeScroll  (){
        return;
    }
13
Davide Vosti

Je suis tombé sur une bonne solution ici:

téléavertisseur horizontal

il s'agit d'une version GitHub nettoyée du code trouvé ici:

Sélecteur de vue réelle

Cela peut sembler exagéré de simplement l'utiliser sur des images, mais cette solution permet une pagination infinie avec une petite astuce (c'est-à-dire: lorsque sur la première page, vous pouvez revenir à la dernière page et lorsque sur la dernière page, vous pouvez faire défiler vers la première page ). Il vous permet également d'avoir un nombre inconnu de pages et de générer dynamiquement du contenu en utilisant une autre petite astuce. S'il vous plaît voir mon commentaire dans le deuxième lien ici

pour plus de détails sur la façon dont j'ai accompli cela.

J'espère que cela t'aides.

20
aveyD

Le nouveau package de compatibilité (révision 3) dans Android a ajouté un ViewPager qui fait cela.

http://developer.Android.com/sdk/compatibility-library.html

15
Patrick Boos