Android si comportano ScrollView orizzontale come iPhone ( paging)

? Davide Vosti @ | Original: StackOverFlow
---

Ho un LinearLayout all'interno di un HorizontalScrollView . Il contenuto è solo un'immagine . Mentre lo scorrimento, ho bisogno di ottenere lo stesso comportamento che si ottiene quando si imposta l'opzione di paging su un equivalente iPhone del HSW ( scorrendo la lista dovrebbe fermarsi a ogni pagina della lista, non continuare a muoversi ) .

Come si fa a Android ? Devo implementare questa funzionalità da solo o c'è una proprietà particolare per impostare o una sottoclasse di HSV di attuare ?

---

Top 5 Risposta

1Davide Vosti @

Quindi, la mia soluzione è :

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

Il metodo computeScroll la chiamata per spostare la lista . Per impostazione predefinita Suppongo che sia implementato per rallentare con un certo rapporto ... Dal momento che non voglio che questa mozione, ho appena sovrascrivo senza specificando un corpo .

Il codice per il gestore di eventi è :

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

E nella mia HorizontalScrollView ereditato

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

Mi sono imbattuto in una bella soluzione qui :

[ Pager orizzontale ] [ 1 ]

questa è una ripulita versione GitHub del codice trovato qui :

[ Real Vista Switcher ] [ 2 ]

Può sembrare eccessivo per solo utilizzo sulle immagini, ma questa soluzione permette di paginazione infinita con l'utilizzo di un piccolo trucco ( es : quando in prima pagina si può scorrere indietro all'ultima pagina e quando in ultima pagina è possibile scorrere in avanti alla prima pagina ) . Esso permette anche di avere un numero imprecisato di pagine e dinamicamente generare contenuti utilizzando un altro piccolo trucco . Si prega di vedere il mio commento nel secondo link http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

per i dettagli su come ho compiuto questo .

Spero che sia di aiuto.

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

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

3Patrick Boos @

Il nuovo pacchetto di compatibilità ( versione 3) in Android ha aggiunto un ViewPager che lo fa .

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

4David Hernandez @

ho trovato un altro modo per ottenere lo stesso effetto e credo sia più leggibile . Ecco il modo :

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