2012-02-07 38 views
5

Estoy usando un ViewPager en mi aplicación que alberga un diseño horizontal de imágenes para implementar una galería paginada.Android - ViewPager scrolling resets

Cuando pruebo la vista solo, es decir, como la vista principal de una actividad, funciona bien. Sin embargo, cuando incluyo esto como parte de otro diseño, el desplazamiento (o parpadeo) se vuelve extraño. Si parece que se restablece a su posición original aproximadamente a la mitad de un deslizamiento (películas realmente rápidas son lo único que he llegado a trabajar hasta ahora).

¿Alguna idea de lo que podría ser el problema?

En caso de que sea de alguna relevancia, la vista se infla desde XML y se agrega en una clase heredada PagerAdapter.

Respuesta

9

Sí, ViewPager y otros elementos de desplazamiento no funcionan bien por defecto. Cuando tengo que hacer tales cosas, generalmente hago una subclase ViewPager para hacer algo que tenga en cuenta a los niños que pueden desplazarse. Luego, en mi onInterceptTouchEvent(), compruebo si el hit rect está dentro de ese niño y no intercepto el evento táctil para que el niño lo golpee. Algo como esto:

/** 
* Override to not intercept touch events within our scroller if it exists. 
*/ 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if(scrollerId != 0) { 
     View scroller = findViewById(scrollerId); 
     if(scroller != null) { 
      Rect rect = new Rect(); 
      scroller.getHitRect(rect); 
      if(rect.contains((int)ev.getX(), (int)ev.getY())) { 
       return false; 
      } 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
} 

Entonces todo lo que necesita es una manera de establecer que scrollerId (un método público sencilla funciona).

Nota otra manera es si está utilizando un ScrollView para verticalmente elementos de desplazamiento con ViewPager hijos, tendrá que ir a una dirección diferente. Tenga una subclase de ScrollView que detecte las direcciones de desplazamiento vertical y las fianzas para el desplazamiento horizontal, de modo que el ViewPager la levante.

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
    } 

    return super.onInterceptTouchEvent(ev); 
} 
+0

imaginó que llegaría a abajo a MotionEvents ... nunca entendió eso mucho, pero tal vez el código de ejemplo ayudará a conseguir allí ... Voy a probarlo ahora –

+0

Sí ... eso trabajos. Sin embargo, dado que estoy empezando a comprender esto ahora, creo que tendré otro problema pronto, ya que pretendo hacer clic en las imágenes dentro de ViewPager y que necesitan para iniciar actividades. Cualquier consejo sobre eso ... creo que debería atrapar ACTION_MOVE y dejar que ACTION_DOWN sea similar a tu segundo ejemplo. –

+0

No, eso no debería ser un gran problema. Establezca su 'onClickListener' en' ImageView' y asegúrese de configurarlos como clicables (ya sea en su diseño XML o en el código) y debe estar bien. La acción de clic es un camino ligeramente diferente que los eventos de movimiento. –