2012-06-07 12 views
7

Ho rotto la testa da un paio d'ore, ho cercato su Google e nessuno degli esempi su StackOverflow o altri posti ha funzionato per me, ecco qui ...La vista personalizzata con i pulsanti implementa OnGestureListener

Ho una vista personalizzata, quella extends LinearLayout and implements GestureDetector.OnGestureListener.

Nel mio layout personalizzato ho 3 pulsanti, ognuno ha un click listener. Quello che voglio è essere in grado di lanciare ovunque nella vista per eseguire qualcosa, ma anche di essere in grado di fare clic sui pulsanti.

La funzione onFling funziona in modo ottimale se lancio nella vista ma non su uno dei pulsanti. Se lancio uno dei pulsanti, esegue un clic nella maggior parte dei casi o nulla in alcuni.

Ecco la parte rilevante del mio codice:

@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; 
    } 

provato qualsiasi combinazione di return true; restituisce falso; Potrei pensare ... Gradirei qualsiasi aiuto! :)

Grazie!

risposta

3

ecco cosa risolto per me alla fine ... (solo il codice modificato dalla mia domanda). Non so se è la soluzione migliore ma funziona:

@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); 
    } 

Questo permetterà al gesto scappatella, anche sopra i pulsanti e anche permettere semplice click sui pulsanti MA se si dispone di un'altra vista con i tasti alla base di questa vista, a volte i clic passeranno all'indietro ed eseguiranno onClick sui pulsanti dietro la vista. La soluzione per questo è aggiungere "android:clickable="true" al layout radice della vista frontale (LinearLayout, FrameLayout o qualsiasi altra cosa).

0

Forse si potrebbe impostare una sovrapposizione utilizzando SurfaceView in wich gestire tutti i scaglia: http://developer.android.com/reference/android/view/SurfaceView.html

Con il SurfaceView in primo piano, i pulsanti devono ancora lavoro e la vostra scaglia dovrebbero essere in grado di superare i tasti senza alcuna i problemi.

+0

grazie per la risposta, ma preferisco non utilizzare SurfaceView in quanto non è destinato a questo e principalmente perché il mio problema dovrebbe essere una questione di impostare il giusto "return true; return false" nei metodi giusti. –

Problemi correlati