2016-02-08 3 views
0

J'ai un problème avec GestureDetector et Clickable RelativeLayout en même temps. Lorsque mon RelativeLayout n'est pas cliquable, l'application reconnaît parfaitement chaque geste, mais lorsque je mets la mise en page cliquable, l'application ne reconnaît pas les gestes. Y at-il un moyen d'utiliser les deux en même temps?Utilisation de GestureDetector et de RelativeLayout cliquable

Répondre

0

Malheureusement, onClick() & OnTouch() ne peut pas se comporter normalement lorsqu'il est utilisé ensemble. J'utilise une solution de rechange pour détecter un clic en utilisant onTouch. Je ne suis pas sûr comment il se comportera avec le détecteur de mouvement présent. Je vais partager mon code .. Il fonctionne très bien sans détecteur de gestes. Faites-moi savoir si ça ne marche pas.

Initialiser vos auditeurs:

GestureDetector gdt; 
View.OnTouchListener touchListener; 
private void initializeListener() 
{ 
    gdt = new GestureDetector(mContext,new GestureListener()); 
    touchListener = new View.OnTouchListener() { 
     float startX; 
     float startY; 
     float CLICK_ACTION_THRESHOLD = 5; 
     //Uses the touched coordinates recorded through MOTION_DOWN & MOTION_UP to detect whether the action performed was a click 
     private boolean isAClick(float startX, float endX, float startY, float endY) { 
      if(isLoadingView) 
       return false; 

      float differenceX = Math.abs(startX - endX); 
      float differenceY = Math.abs(startY - endY); 
      return !(differenceX > CLICK_ACTION_THRESHOLD || differenceY > CLICK_ACTION_THRESHOLD); 
     } 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        startX = event.getX(); 
        startY = event.getY(); 
        break; 
       case MotionEvent.ACTION_UP: { 
        float endX = event.getX(); 
        float endY = event.getY(); 

        if (isAClick(startX, endX, startY, endY)) 
        { 
         switch (v.getId()) 
         { 
          case R.id.view_id: 
          break 

         } 
        } 
       } 
       break; 
      } 
      gdt.onTouchEvent(event); 
      return true; 
     } 
    }; 
} 

Ajouter Listener aux vues:

private void addTouchListenerToView(View v) { 
    v.setOnTouchListener(touchListener); 
} 

échantillon Classe: Gesture Listener

private class GestureListener extends GestureDetector.SimpleOnGestureListener { 
    private final int SWIPE_MIN_DISTANCE = 153; 
    private final int SWIPE_THRESHOLD_VELOCITY = 20; 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Right to left 
     } 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Left to right 
     } 

     if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Bottom to top 
     } 
     else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE)// && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Top to bottom 
     } 

     return true; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
          float distanceY) { 
     if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE*10) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Right to left 
     } 
     else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE*10) //&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) 
     { 
      return false; // Left to right 
     } 
     return true; 
    } 
}