2016-10-13 23 views
1

私のアクティビティでドラッグすることができる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; 
      } 
     }); 
関連する問題