Как сделать свайп с утилизатором Посмотреть объект? - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю на плавающей клавиатуре, используя вид Recycler, который появляется на экране при нажатии кнопки и закрывается, когда выполняется пролистывание вправо / влево.Пока я делал это, я заметил, что смахивание клавиатуры не является более плавным (иногда слушатели смахивания не обнаруживают жесты смахивания).Затем я сослался на следующие ссылки и переработал:

https://medium.com/@euryperez/android-pearls-detect-swipe-and-touch-over-a-view-203ae2c028dc

/3000494/android-kak-obrabatyvat-zhesty-sprava-nalevo.

Я добавил слушателей жестов в потомок представления Recycler и использовал три метода переопределения onClick (), onSwipeRight () и onSwipeLeft ().Положение onClick получается идеально, но иногда прослушиватели смахивания не обнаруживаются, что заставляет пользователей чувствовать, что смахивание не является более плавным.

Все, что мне нужно, - это сделать сглаживание смахивания и определять положение нажатых клавиш без ущерба для обоих.Есть ли способы реализовать эту функцию, если есть способ предложить мне!Вот мой код.Заранее спасибо!.

public ViewHolder(View v) {
 super(v);
 textView = (TextView) v.findViewById(R.id.textView);
 imageView = (ImageView) v.findViewById(R.id.imageView);
 relativeLayout = (RelativeLayout) v.findViewById(R.id.relativeLayout);
 mBodyContainer = (ConstraintLayout) v.findViewById(R.id.body_container);
 cllayout = (RelativeLayout) v.findViewById(R.id.cllayout);
 setSwipeGestureForParent(cllayout);
 }

  private void setSwipeGestureForParent(final View view) {
  view.setOnTouchListener(new OnSwipeTouchListener(mContext) {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
  parentview.stopScroll();
  String view = item.text;
  if (view.equals("")) {
  } else if (v.getId() != R.id.body_container && !view.equals("")) {
  switch (event.getAction()) 
  {
  case MotionEvent.ACTION_DOWN:
  imageView.setBackground(ContextCompat.getDrawable(mContext,             R.drawable.bg_keyboard_key_selected));
  break;
  case MotionEvent.ACTION_MOVE:
  imageView.setBackground(ContextCompat.getDrawable(mContext,     R.drawable.bg_keyboard_key_selected));
  break;
  case MotionEvent.ACTION_BUTTON_PRESS:
  imageView.setBackground(ContextCompat.getDrawable(mContext,       R.drawable.bg_keyboard_key_selected));
  break;
  default:
  imageView.setBackground(ContextCompat.getDrawable(mContext,   R.drawable.bg_keyboard_key_normal));
  break;
  }
  }
  return super.onTouch(v, event);
  }

  @Override
  public void onClick() {
  super.onClick();
  Toast.makeText(mContext, "onclick", Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onSwipeLeft() {
  Toast.makeText(mContext, "Swipeleft", Toast.LENGTH_SHORT).show();
  }

  @Override
  public void onSwipeRight() {
  Toast.makeText(mContext, "SwipeRight", Toast.LENGTH_SHORT).show();
  }
  });
  }

1 Ответ

0 голосов
/ 23 августа 2019

Я подготовил для вас 2 общих класса «копировать и вставить», чтобы вы могли очень легко использовать все жесты в RecyclerView.

1 - GestureDetector - просто добавьте его в свой проект

class OnSwipeTouchListener implements View.OnTouchListener {
    private final GestureDetector gestureDetector;
    public OnSwipeTouchListener(Context ctx, TouchListener touchListener) {
        gestureDetector = new GestureDetector(ctx, new GestureListener(touchListener));
    }
    @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 = 300;
        private static final int SWIPE_VELOCITY_THRESHOLD = 300;
        private TouchListener touchListener;
        GestureListener(TouchListener touchListener) {
            super();
            this.touchListener = touchListener;
        }
        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i("TAG", "onSingleTapConfirmed:");
            touchListener.onSingleTap();
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            Log.i("TAG", "onLongPress:");
            touchListener.onLongPress();
        }
        @Override
        public boolean onDoubleTap(MotionEvent e) {
            touchListener.onDoubleTap();
            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) {
                            touchListener.onSwipeRight();
                        } else {
                            touchListener.onSwipeLeft();
                        }
                        result = true;
                    }
                } else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        touchListener.onSwipeDown();
                    } else {
                        touchListener.onSwipeUp();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }
}

2 - TouchListener - просто добавьте определение интерфейса в свой проект.Чтобы сделать использование еще проще, я использовал некоторые реализации интерфейса по умолчанию.Итак, вам нужно добавить в build.gradle вашего модуля:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Добавить интерфейс:

public interface TouchListener  {
    void onSingleTap();
    default void onDoubleTap() {
        Log.i("TAG",  "Double tap");
    }
    default void onLongPress() {
        Log.i("TAG", "Long press");
    }
    default void onSwipeLeft() {
        Log.i("TAG", "Swipe left");
    }
    default void onSwipeRight() {
        Log.i("TAG", "Swipe right");
    }
    default void onSwipeUp() {
        Log.i("TAG", "Swipe up");
    }
    default void onSwipeDown() {
        Log.i("TAG", "Swipe down");
    }
}

3 - Теперь вы можете присоединить к любому представлению TouchListener и реализовать только теметоды, которые вам действительно нужны.Пример:

holder.anyview.setOnTouchListener(new OnSwipeTouchListener(mCtx, new TouchListener() {
            @Override
            public void onSingleTap() {
                Log.i("TAG", ">> Single tap");
            }

            @Override
            public void onDoubleTap() {
                Log.i("TAG", ">> Double tap");
            }

            @Override
            public void onLongPress() {
                Log.i("TAG", ">> "Long press");
            }

            @Override
            public void onSwipeLeft() {
                Log.i("TAG", ">> Swipe left");
            }

            @Override
            public void onSwipeRight() {
                Log.i("TAG", ">> Swipe right");

            }
        }));

Вот и все!Наслаждаться.

...