2016-10-13 3 views
1

드래그 할 수있는 내 Activity에서 FloatingActionButton (FAB)이 필요합니다. 그러나 당신도 그것을 클릭 할 수 있습니다. 다른 포스트에서 나는 복사이 :Android FAB 드래그 앤 드롭

fab.setOnTouchListener(new View.OnTouchListener() { 

       float startX; 
       int lastAction; 

       @Override 
       public boolean onTouch(View view, MotionEvent event) { 
        switch (event.getActionMasked()) { 
         case MotionEvent.ACTION_DOWN: 
          startX = view.getX() - event.getRawX(); 
          lastAction = MotionEvent.ACTION_DOWN; 
          break; 

         case MotionEvent.ACTION_MOVE: 
          view.setX(event.getRawX() + startX); 
          lastAction = MotionEvent.ACTION_MOVE; 
          break; 

         case MotionEvent.ACTION_UP: 
          if (lastAction == MotionEvent.ACTION_DOWN){ 
           edit(); 
          } 
          break; 
         case MotionEvent.ACTION_BUTTON_PRESS: 

         default: 
          return false; 
        } 
        return true; 
       } 
      }); 

문제는 : 당신이 그것을 클릭 할 경우 종종 클릭으로 인식하지만 움직임으로하지 않습니다. 그래서 이것은 정확하지 않습니다. 어떻게 코드를 변경하여 코드를 개선 할 수 있습니까?

답변

1

드래그 한 거리를 확인하십시오. 10px보다 작 으면 사용자가 드래그하지 않기를 원할 것입니다.

fab.setOnTouchListener(new View.OnTouchListener() { 

      float startX; 
      float startRawX; 
      float distanceX; 
      int lastAction; 

      @Override 
      public boolean onTouch(View view, MotionEvent event) { 
       switch (event.getActionMasked()) { 
        case MotionEvent.ACTION_DOWN: 
         startX = view.getX() - event.getRawX(); 
         startRawX = event.getRawX(); 
         lastAction = MotionEvent.ACTION_DOWN; 
         break; 

        case MotionEvent.ACTION_MOVE: 
         view.setX(event.getRawX() + startX); 

         lastAction = MotionEvent.ACTION_MOVE; 
         break; 

        case MotionEvent.ACTION_UP: 
         distanceX = event.getRawX()-startRawX; 
         if (Math.abs(distanceX)< 10){ 
          edit(); 
         } 
         break; 
        case MotionEvent.ACTION_BUTTON_PRESS: 

        default: 
         return false; 
       } 
       return true; 
      } 
     });