Перехватить просмотрщик жестом проведите пальцем вправо и влево, андроид? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть переработчикПросмотреть.Когда пользователь проведет пальцем вправо или влево, выполните какое-либо действие.Пожалуйста, обратите внимание, что я не спрашиваю о смахивании элемента представления рециркулятора, а весь жест просмотра рециркулятора влево или вправо.

Для этого я расширил View.OnTouchListener и попытался получить жест, как показано ниже

public class OnSwipeTouchListener implements View.OnTouchListener {

private final GestureDetector gestureDetector;

public OnSwipeTouchListener(Context ctx) {
    gestureDetector = new GestureDetector(ctx, new GestureListener());
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends GestureDetector.SimpleOnGestureListener {

    private static final int SWIPE_THRESHOLD = 100;
    private static final int SWIPE_VELOCITY_THRESHOLD = 100;

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

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        boolean result = false;
        try {
            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();
                    }
                    result = true;
                }
            } /*else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffY > 0) {
                    onSwipeBottom();
                } else {
                    onSwipeTop();
                }
                result = true;
            }*/
        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return result;
    }
}

public void onSwipeRight() {
}

public void onSwipeLeft() {
}


/*public void onSwipeTop() {
}

public void onSwipeBottom() {
}
*/
}

Затем использовал его как

recyclerViewComponent.setOnTouchListener(new OnSwipeTouchListener(context){
        @Override
        public void onSwipeRight() {
            super.onSwipeRight();
        }

        @Override
        public void onSwipeLeft() {
            super.onSwipeLeft();
        }
    });

Но я не получаю обратного вызова.Что в этом плохого?

1 Ответ

0 голосов
/ 05 июня 2018

Согласно официальному Google doc , вы должны использовать onInterceptTouchEvent при работе с ViewGroups (RecyclerView extends ViewGroup).Таким образом, вам нужно расширить класс RecyclerView, чтобы переопределить его метод onTouchInterceptTouchEvent:

public class MyRecyclerView extends RecyclerView {

   @Override
   public boolean onInterceptTouchEvent(MotionEvent ev) {
       switch (MotionEventCompat.getActionMasked(ev)) {
          case MotionEvent.ACTION_MOVE: {
           [...]
          }
       }        
   }

}

Затем вам также нужно изменить XML-файл макета, чтобы использовать пользовательский RecyclerView MyRecyclerView.

В качестве альтернативы вы можете адаптировать решение с использованием сторонних компонентов / библиотек, таких как this или this .

...