Android horizontale se comportent scrollview comme l'iPhone (paging )

? Davide Vosti @ | Original: StackOverFlow
---

Je ai un LinearLayout l'intérieur d'un HorizontalScrollView . Le contenu est juste une image . Pendant le défilement, je ai besoin pour obtenir le même comportement que vous obtenez lors de la configuration de l'option d'échange sur l'iPhone un équivalent de la HSW ( défilement de la liste devrait se arrêter à chaque page sur la liste, et non pas continuer à se déplacer ) .

Comment cela se fait dans Android ? Dois-je mettre en œuvre cette fonctionnalité par moi-même ou se il ya une propriété particulière pour définir ou une sous-classe de HSV à mettre en œuvre ?

---

Top 5 Répondre

1Davide Vosti @

Donc, ma solution est :

Intercept the onTouch event and calculate whether the page should change to the next or keep on the current Inherit from HorizontalScrollView and override the method computeScroll

La méthode la computeScroll appelé à déplacer la liste . Par défaut, je suppose que ce est mis en œuvre pour décélérer avec un certain rapport ... Comme je ne veux pas cette motion, je viens de passer outre sans spécifiant un corps .

Le code pour le gestionnaire d'événement 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 HorizontalScrollView héritée

@Override
    public void  computeScroll  (){
        return;
    }
2aveyD @

Je suis tombé sur une belle solution ici:

[ Pager Horizontal ] [ 1 ]

ce est une version nettoyée GitHub du code trouvé ici:

[ Real Voir Switcher ] [ 2 ]

Il peut sembler exagéré pour juste l'utiliser sur les images, mais cette solution permet pour la pagination infini avec l'aide d'un petit truc (ex: lorsque sur la première page, vous pouvez revenir en arrière à la dernière page et quand à la dernière page, vous pouvez défiler vers l'avant à la première page ) . Il vous permet également d'avoir un nombre inconnu de pages et de générer du contenu en utilisant un autre petit truc dynamiquement . Se il vous plaît voir mon commentaire dans le deuxième lien http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

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

J'espère que cela t'aides.

[1]: https://github.com/ysamlan/horizontalpager

[2]: http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html

3Patrick Boos @

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

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

4David Hernandez @

je ai trouvé une autre façon d' obtenir le même effet et je pense que ce est plus lisible . Voici la façon dont :

@Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = hsv.getScrollX();
                float pagesCount = hsv.getChildCount();
                float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;

                int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
                hsv.scrollTo((int) (page * pageLengthInPx), 0);
            }

            return false;
        }