2010-04-07 17 views
29

Tengo un LinearLayout dentro de un HorizontalScrollView. El contenido es solo una imagen. Mientras se desplaza, necesito lograr el mismo comportamiento que recibo al configurar la opción de búsqueda en un iPhone equivalente al HSW (al desplazarse, la lista debe detenerse en cada página de la lista, no continuar moviéndose).Android scrollview horizontal se comporta como iPhone (paginación)

¿Cómo se hace esto en Android? ¿Debería implementar estas características yo solo o hay una propiedad particular para configurar o una subclase de HSV para implementar?

+1

Comprobar este tutorial, funciona y es muy simple para una paginación horizontal: [http://mobile.tutsplus.com/tutorials/android/android-user-interface-design- horizontal-view-paging /] (http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/) – pedrotorres

Respuesta

13

lo tanto, mi solución es:

  1. Intercepción caso onTouch y calcular si la página debe cambiar a la siguiente o seguir la corriente
  2. Heredar del HorizontalScrollView y reemplazar el método computeScroll

El método compute Desplaza la llamada para mover la lista. De manera predeterminada, supongo que está implementado para desacelerar con una determinada relación ... Como no quiero este movimiento, simplemente lo anulo sin especificar 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 heredada

@Override 
    public void computeScroll (){ 
     return; 
    } 
+1

¿Qué es _horizontalBar en este código? – nirav

+0

Lo siento pero no recuerdo.Es una vieja pregunta, lo siento :( –

20

me encontré con una solución agradable aquí:

Horizontal Pager

esto es una versión limpiada de GitHub del código que se encuentra aquí:

Real View Switcher

Puede parecer una exageración para usar sólo en imágenes, pero esta solución permite la paginación infinita con el uso de un pequeño truco (es decir: cuando en la primera página puede desplazarse hacia atrás a la última página y cuando el última página puede avanzar a la primera página). También le permite tener un número desconocido de páginas y generar contenido de forma dinámica utilizando otro pequeño truco. Por favor, consulte mi comentario en el segundo enlace here

para obtener detalles sobre cómo logré esto.

Espero que esto ayude.

+0

el problema con Horizontal Page o Real View Switcher es que si agrega un ListView como elemento secundario, y el ListView no excede la altura de la pantalla, el espacio intermedio (la última fila del ListView a al final de la pantalla) está lleno de "blanco" o un fondo transparente. ¿Alguna idea sobre este tema? – jake

+0

realmente una buena solución me ayudó mucho en mi codificación. – nirav

+0

ya me ayudó – Mahesh

13

El nuevo Paquete de compatibilidad (revisión 3) en Android agregó una ViewPager que hace eso.

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

+0

ViewPager documentos están aquí: http://developer.android.com/reference/android/support/v4/view/ViewPager.html –

+0

Tutorial de ViewPager aquí: http://developer.android.com/training/animation/screen-slide.html –

-1

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; 
     } 
+0

Donde hsv es el objeto HorizontalScrollView: P –

+1

Creo que HorizontalScrollView solo aceptará un elemento secundario, que es de algún tipo o f Grupo de diseño ... este grupo es donde se agregarán los niños, por lo que a partir de allí se recuperará el número de ellos. –

Cuestiones relacionadas