1

I am trying to achieve swipe left and Pinch inward event on recycleview. After implementing both (swipe and pinch) as touch listener on recycleview. Its behaving quite weird. Most of the time onFling() method has e1= null. Even pinch also not so perfect. At the time of pinch mostly it scrolls and pinch doesn't work. Here is my code:

   mScaleDetector = new ScaleGestureDetector(getActivity(), new ScaleListener());
    mGestureDetector = new GestureDetector(getActivity(), new GestureListener());

recycleview.setOnTouchListener((v, event) -> {

 if (mGestureDetector.onTouchEvent(event)) {

        return false;
 } else if (mScaleDetector.onTouchEvent(event)) {

        return false;
}
      return true;

    });

 private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
    private float mScaleFactor = 1.0f;

    @Override
    public boolean onScale(ScaleGestureDetector detector) {
      super.onScale(detector);
      mScaleFactor = detector.getScaleFactor();
      return true;
    }

    @Override
    public boolean onScaleBegin(ScaleGestureDetector detector) {
      super.onScaleBegin(detector);
      return true;
    }

    @Override
    public void onScaleEnd(ScaleGestureDetector detector) {
      super.onScaleEnd(detector);
      if (mScaleFactor > 1) {
        //Toast.makeText("Zooming Out");
      } else if (mScaleFactor < 1) {
        //((AllShowsFragmentView) mContext).pinchInward();
        //Toast.makeText("Zooming In");
        moveToHomeScreen();
      }

    }
  }

  private class GestureListener extends GestureDetector.SimpleOnGestureListener {

  private static final int SWIPE_THRESHOLD = 100;
  private static final int SWIPE_VELOCITY_THRESHOLD = 100;
  protected MotionEvent mLastOnDownEvent = null;

  /*  @Override
    public boolean onSingleTapUp(MotionEvent e)
    {
      //single tap returns true so we know to register it over a swipe
      //onSingleTap();
      return false;
    }*/


    @Override
    public boolean onSingleTapConfirmed(MotionEvent e) {
      //onSingleTap();
      return super.onSingleTapConfirmed(e);
    }

    @Override
    public boolean onDown(MotionEvent e) {
      mLastOnDownEvent = e;
      return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      boolean result = false;
      try {
        if (e1==null)
          e1 = mLastOnDownEvent;
        if (e1==null || e2==null)
          return false;
        float diffY = e2.getY() - e1.getY();
        float diffX = e2.getX() - e1.getX();
        if (Math.abs(diffX) > Math.abs(diffY)) {
          if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
            if (diffX > 0) {
              //onSwipeRight();
            } else {
              //onSwipeLeft();
              moveToHomeScreen();
            }
            result = false;
          }
        } else if (Math.abs(diffY) > SWIPE_THRESHOLD
            && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
          if (diffY > 0) {
            //onSwipeBottom();
          } else {
            //onSwipeTop();
          }
          result = false;
        }
      } catch (Exception exception) {
        exception.printStackTrace();
      }
      return result;
    }
  }
cyrus000
  • 67
  • 1
  • 9

1 Answers1

0

Try ItemTouchHelper. It works smoothly.

Kruti Parekh
  • 1,271
  • 9
  • 21
  • I tried it. But on swipe I don't want any animation like dragging. Just need a event listener for it. – cyrus000 Apr 10 '18 at 07:08
  • Try returning 0 in overridden method `getSwipeDirs` like this: `@Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return 0; }` – Kruti Parekh Apr 10 '18 at 07:22
  • I tried it. It stops animation. But it also stops the calling of onSwiped. – cyrus000 Apr 10 '18 at 07:29
  • Try calling it programmatically: `@Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { onSwiped(viewHolder, super.getSwipeDirs(recyclerView, viewHolder)); return 0; }` – Kruti Parekh Apr 10 '18 at 07:43
  • Do you have any idea. What should I do in case of pinch. Because mostly it scrolls. When I try to pinch – cyrus000 Apr 10 '18 at 09:15
  • Have you checked [this](https://stackoverflow.com/questions/35082638/recyclerview-animate-change-of-grid-layout-manager-columns) link? – Kruti Parekh Apr 10 '18 at 09:52
  • onSwiped()..left to right or right to left.. it always giving direction == left on onSwipe. After adding your code. – cyrus000 Apr 10 '18 at 13:34