Android comportan scrollview horizontal como iPhone ( paging )

? Davide Vosti @ | Original: StackOverFlow
---

Tengo un LinearLayout dentro de un HorizontalScrollView . El contenido es sólo una imagen. Mientras se desplaza, lo que necesito para conseguir el mismo comportamiento que se obtiene al establecer la opción de paginación en un equivalente del iPhone de la HSW ( el desplazamiento de la lista debe parar en todas las páginas de la lista, no continuará en movimiento) .

¿Cómo se hace esto en Android? ¿Debo aplicar esta cuenta por mí mismo o hay una propiedad particular, establecer o una subclase de VHS a implementar?

---

Top 5 Respuesta

1Davide Vosti @

Así que, mi solución es:

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

El método computeScroll la llama para mover la lista . Por defecto, supongo que está implementado para desacelerar con cierta relación ... Como yo no quiero que este movimiento, acabo de anularlo sin especificando un cuerpo.

El código del controlador de eventos es:

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

Y en mi HorizontalScrollView heredado

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

Me encontré con una bonita solución aquí :

[ Pager Horizontal ] [ 1 ]

esta es una versión GitHub limpiado del código que se encuentra aquí:

[ Real Ver Switcher ] [ 2 ]

Puede parecer una exageración para usar sólo en imágenes, pero esta solución permite para paginación infinito con el uso de un pequeño truco (es decir : cuando en la primera página usted puede desplazarse hacia atrás a la última página, y cuando en la última página usted puede desplazarse hacia adelante a la primera página ) . También le permite tener un número indeterminado de páginas y dinámicamente generar contenido utilizando otro pequeño truco . Por favor, ver a mi comentario en el segundo link http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

para más detalles sobre cómo lo logré .

Espero que esto ayude.

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

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

3Patrick Boos @

El nuevo paquete de compatibilidad (revisión 3 ) en Android añade un ViewPager que hace eso.

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

4David Hernandez @

He encontrado otra manera de conseguir el mismo efecto y creo que es más fácil de leer . Esta es la forma :

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