2016-02-08 2 views
0

У меня есть проблема с использованием GestureDetector и интерактивного RelativeLayout в одно и то же время. Когда мой RelativeLayout не доступен для клика, приложение распознает каждый жест отлично, но когда я устанавливаю макет для кликабеля, приложение не повторяет жесты. Можно ли использовать оба метода одновременно?Использование GestureDetector и clickable RelativeLayout

ответ

0

К сожалению, onClick() & onTouch() не может нормально себя вести при использовании вместе. Я использую обход для обнаружения щелчка с помощью onTouch. Я не уверен, как он будет вести себя с детектором жестов. Я поделюсь своим кодом .. Он отлично работает без детектора жестов. Дайте мне знать, если он не работает.

Initializing слушатели:

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

Добавить Слушатель в просмотры:

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

Пример класс Жест Слушатель:

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; 
    } 
} 
Смежные вопросы