2011-03-12 15 views
6

Tengo una galería con un adaptador que lo proporciona ScrollViews como vistas secundarias. necesito para asegurarse de que los eventos táctiles se manejan correctamente y como se esperaba:ScrollView dentro de Galería, ambos desplazándose independientemente

  1. Cuando el usuario se desplaza horizontalmente, los rollos de la galería horizontal.
  2. Cuando el usuario se desplaza verticalmente, la vista de desplazamiento se desplaza verticalmente.
  3. Ambos desplazamientos nunca deben realizarse con el mismo gesto (el usuario debe levantar el dedo para desplazarse por la otra vista).
  4. Todo debe desplazarse sin problemas.

Sin sobreescribir ningún método, la vista de desplazamiento es lo único que se desplaza: la galería nunca se desplaza.

Entiendo que necesito utilizar enInterceptTouchEvent (...) en la galería para decidir asumir una determinada serie de MotionEvents, pero no estoy seguro de cómo comprobar si el toque es de naturaleza horizontal o vertical.

Respuesta

19

bien, después de algún importante tocar el violín y Logcat piratería informática, aquí está la solución: solución

public class SwipeInterceptingGallery extends Gallery { 

    private float mInitialX; 
    private float mInitialY; 
    private boolean mNeedToRebase; 
    private boolean mIgnore; 

    public SwipeInterceptingGallery(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public SwipeInterceptingGallery(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public SwipeInterceptingGallery(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     if (mNeedToRebase) { 
      mNeedToRebase = false; 
      distanceX = 0; 
     } 
     return super.onScroll(e1, e2, distanceX, distanceY); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
     switch (e.getAction()) { 
      case MotionEvent.ACTION_DOWN: { 
       mIgnore = false; 
       mNeedToRebase = true; 
       mInitialX = e.getX(); 
       mInitialY = e.getY(); 
       return false; 
      } 

      case MotionEvent.ACTION_MOVE: { 
       if (!mIgnore) { 
        float deltaX = Math.abs(e.getX() - mInitialX); 
        float deltaY = Math.abs(e.getY() - mInitialY); 
        mIgnore = deltaX < deltaY; 
        return !mIgnore; 
       } 
       return false; 
      } 
      default: { 
       return super.onInterceptTouchEvent(e); 
      } 
     } 
    } 
} 
+1

+1 buen tío intentaré esto. –

+1

excelentes trabajos perfectos, gracias – binnyb

+0

qué circunstancias usan esta galería, ¿puedes dar más detalles, o dar un ejemplo, muy, muy gracias – pengwang

0

He tratado proporcionada por Warlax. Me impulsó hacia adelante, pero desafortunadamente rompe el comportamiento normal de la galería en algunos casos raros. (Por ejemplo, no se detiene al tocar mientras se desplaza) Así que hice más investigación y se me ocurrió la siguiente solución.

public class TouchInterceptingGallery extends Gallery { 

    public TouchInterceptingGallery(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public TouchInterceptingGallery(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public TouchInterceptingGallery(Context context) { 
     super(context); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     this.onTouchEvent(ev); 
     return false; 
    } 

} 
Cuestiones relacionadas