Android horizontale Scroll verhalten sich wie iPhone (Paging)

? Davide Vosti @ | Original: StackOverFlow

Ich habe einen Linearlayout in einem HorizontalScrollView . Der Inhalt ist nur ein Bild . Beim Scrollen, muss ich das gleiche Verhalten, das Sie bei der Einstellung des Paging- Option auf einen der iPhone Äquivalent der HSW ( Scrollen der Liste sollte an jeder Seite auf der Liste anzuhalten, nicht weiter bewegen ) zu erzielen.

Wie ist das in Android getan? Sollte ich implementieren diese Funktion von mir oder gibt es eine bestimmte Eigenschaft zu setzen oder eine Unterklasse der HSV zu implementieren ?

Top 5 Antwort

1Davide Vosti @

So ist meine Lösung :

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

Die Methode computeScroll das heißt, um die Liste zu verschieben. Standardmäßig Ich nehme an, es ist implementiert, um mit einem bestimmten Verhältnis zu verlangsamen ... Da ich nicht wollen, dass diese Bewegung, ich überschreiben es einfach ohne specifing einen Körper .

Der Code für die Ereignisbehandlungsroutine ist :

_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;
        }
    });

Und in meinem geerbt HorizontalScrollView

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

Ich stieß auf eine schöne Lösung hier:

[Horizontale Pager ] [1]

dies ist ein aufgeräumt GitHub Version des Codes hier :

[Real anzeigen Switcher ] [2]

Es kann wie ein Overkill für nur Sie es auf Bildern erscheinen, aber diese Lösung ermöglicht eine unendliche Paging mit mit einem kleinen Trick (dh : wenn auf der ersten Seite können Sie zurück zur letzten Seite und blättern Sie, wenn auf der letzten Seite können Sie sich auf erste Seite blättern ) . Es erlaubt Ihnen auch, eine unbekannte Anzahl von Seiten haben und dynamisch zu generieren Inhalte mithilfe einer anderen kleinen Trick . Sehen Sie bitte mein Kommentar in der zweiten Verbindung http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

für Details, wie ich dies erreicht .

Hoffe das hilft.

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

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

3Patrick Boos @

Die neue Kompatibilitätspaket( Version 3) in Android soeben einen ViewPager, die das tut.

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

4David Hernandez @

Ich fand einen anderen Weg, um den gleichen Effekt zu erzielen, und ich denke, ist besser lesbar. Hier ist die Art und Weise :

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