2011-12-21 16 views
6

Tengo páginas de desplazamiento horizontal como en el mercado de Android (ViewPager).Vista de desplazamiento horizontal dentro de ViewPager

Mi problema es que quiero tener una vista de desplazamiento horizontal en ellas con algunas imágenes? ¿Es eso posible?

Como ahora, obtengo un pequeño pergamino en mi opinión y luego toda la página se desplaza.

¡Gracias por su tiempo!

+0

reloj [esto] (http://stackoverflow.com/questions/7774642/scroll-webview-horizontally-inside-a-viewpager) respuesta. Pero en lugar de WebView personalizado en esa respuesta, es posible que necesite extender su HorizontalScrollingView. – grine4ka

Respuesta

0
<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      <ImageView1></ImageView> 
      <ImageView2></....> 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

En el caso anterior, scrollVIew es aplicable solo para las dos imágenes, no para el texto de edición.

En otro caso:

<Linearlayout> 
    <linearlayout> 
     <scrollView> 
      here listVIew with Images using listView adapter 
     </scrollView> 
    </Linearlayout> 
    <EditText> 
</Linearlayout> 

Aquí ScrollView es aplicable sólo ListView.

18

Necesita extender el HorizontalScrollView e interceptar eventos táctiles. Lo que funcionó para mí fue la muestra siguiente:

public class MyScrollView extends HorizontalScrollView { 

    public MyScrollView(Context p_context, AttributeSet p_attrs) 
    { 
     super(p_context, p_attrs); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent p_event) 
    { 
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent p_event) 
    { 
     if (p_event.getAction() == MotionEvent.ACTION_MOVE && getParent() != null) 
     { 
      getParent().requestDisallowInterceptTouchEvent(true); 
     } 

     return super.onTouchEvent(p_event); 
    } 
} 

Entonces, en lugar de utilizar el HorizontalScrollView XML en su diseño, es necesario utilizar esta vista personalizada.

Lo que me ayudó a llegar a esta solución es this post

+0

¡Funciona para mí, otras soluciones no! Pero parece que deshabilita el manejo de clic en los botones dentro de su vista de desplazamiento personalizada. ¿Alguna idea? – user1365836

+0

@ user1365836 Sí ... eso puede ser un poco complicado ... Lo que hice fue usar getHitRect y encontrar el botón exacto presionado y luego llamar a su función OnClick – Muzikant

+6

Si lo único que quieres hacer es permitir el desplazamiento, pero aún así permitir el usuario para hacer clic en los elementos dentro, solo tiene que controlar todo desde inside on InterceptTouchEvent(). https://gist.github.com/brandondenney/b8ddd655664eb295129d – Brandon

1

he vuelto a trabajar una solución y finalmente encontré una manera muy simple de implementar la misma manera que se ha hecho en Gmail: la HorizontalScrollView se desplazará hasta que llega a una de sus bordes. Luego, en el siguiente desplazamiento, se desplazará toda la página.

Todo lo que se requería era anular HorizontalScrollView para verificar la dirección de desplazamiento en comparación con los bordes y también asegurarse de que el contenido se puede desplazar.

@Override 
public boolean onTouchEvent(MotionEvent ev) 
{ 
    if (no_scrolling) 
     return false; 

    // Standard behavior 
    // 
    return super.onTouchEvent(ev); 
} 

boolean no_scrolling = false; 
float old_x, old_y; 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) 
{ 
    int action = ev.getActionMasked(); 
    Log.d(at_data.TAG, "HSV scroll intercept: " + String.format("0x%08x", action)); 

    if (action == MotionEvent.ACTION_DOWN) 
    { 
     old_x = ev.getX(); 
     old_y = ev.getY(); 
     no_scrolling = false; 

    } 
    else if (action == MotionEvent.ACTION_MOVE) 
    { 
     float dx = ev.getX() - old_x; 
     float dy = ev.getY() - old_y; 

     if (Math.abs(dx) > Math.abs(dy) && dx != 0) 
     { 
      View hsvChild = getChildAt(0); 
      int childW = hsvChild.getWidth(); 
      int W = getWidth(); 

      Log.d(at_data.TAG, "HSV " + childW + " > " + W + " ? dx = " + dx + " dy = " + dy); 
      if (childW > W) 
      { 
       int scrollx = getScrollX(); 
       if ((dx < 0 && scrollx + W >= childW) || (dx > 0 && scrollx <= 0)) 
       { 
        Log.d(at_data.TAG, "HSV Wider: on edge already"); 
        no_scrolling = true; 
        return false; 
       } 
       else 
       { 
        Log.d(at_data.TAG, "HSV Wider: can scroll"); 
        no_scrolling = false; 
       } 
      } 
      else 
      { 
       Log.d(at_data.TAG, "HSV cannot scroll in desired direction"); 
       no_scrolling = true; 
      } 
     } 
    } 

    // Standard behavior 
    // 
    return super.onInterceptTouchEvent(ev); 
} 
Cuestiones relacionadas