2012-06-07 815 views
7

He estado rompiéndome la cabeza durante las últimas horas, he buscado Google en Google y ninguno de los ejemplos en StackOverflow u otros lugares me funcionaron así que aquí va ...Vista personalizada con botones implementa OnGestureListener

Tengo una vista personalizada, que extends LinearLayout and implements GestureDetector.OnGestureListener.

En mi diseño personalizado tengo 3 botones, cada uno tiene un oyente de clic. Lo que quiero es poder Fling en todas partes en la vista para realizar algo, pero también para poder hacer clic en los botones.

Mi función onFling funciona muy bien si arrojo dentro de la vista pero no sobre uno de los botones. Si arrojo uno de los botones, hace un clic en la mayoría de los casos o nada en algunos.

Aquí está la parte pertinente de mi código:

@Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 
     if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) { 
      return false; 
     } 
     // right to left swipe 
     if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      viewFlipper.setInAnimation(slideLeftIn); 
      viewFlipper.setOutAnimation(slideLeftOut); 
      viewFlipper.showNext(); 
      return true; 

     } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
      viewFlipper.setInAnimation(slideRightIn); 
      viewFlipper.setOutAnimation(slideRightOut); 
      viewFlipper.showPrevious(); 
      return true; 
     } 

     return false; 
    } 

    @Override 
    public boolean onDown(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
      float distanceY) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     if (gestureDetector.onTouchEvent(event)) { 
      return gestureDetector.onTouchEvent(event); 
     } 
     return false; 
    } 

intentaron cualquier combinación de retorno verdadera; falso retorno; Podría pensar ... ¡apreciaría cualquier ayuda! :)

Gracias!

Respuesta

3

Aquí está lo resuelto por mí con el tiempo ... (sólo el código modificado de mi pregunta). No estoy seguro de si es la mejor solución, pero funciona:

@Override 
    public boolean onDown(MotionEvent e) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

@Override 
    public boolean onTouchEvent(MotionEvent e) { 
     return gestureDetector.onTouchEvent(e); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent e) { 
     return onTouchEvent(e); 
    } 

Esto permitirá que el gesto de aventura, incluso por encima de los botones y también permiten simple clic en los botones PERO si tiene otra vista con los botones detrás de esta Ver, a veces los clics pasarán hacia atrás y realizarán clic en botones detrás de la vista. La solución para esto es agregar "android:clickable="true" al diseño raíz de la vista frontal (LinearLayout, FrameLayout o lo que sea).

0

Tal vez usted podría establecer una superposición usando SurfaceView EN LAS QUE manejar todas las aventuras: http://developer.android.com/reference/android/view/SurfaceView.html

Con la SurfaceView en la cima, sus botones deben aún funcionan y sus aventuras deberían ser capaces de superar los botones sin ningún problemas.

+0

gracias por responder, pero prefiero no utilizar SurfaceView ya que no está destinado a esto y principalmente porque mi problema se supone que es una cuestión de establecer el correcto "return true; return false" en los métodos correctos. –

Cuestiones relacionadas