Как сделать свайп с утилизатором Посмотреть объект?
Я работаю над плавающей клавиатурой, используя вид Recycler, который появляется на экране при нажатии кнопки, и закрывается, когда выполняется пролистывание вправо / влево. Пока я делал это, я заметил, что смахивание клавиатуры не является более плавным (иногда слушатели смахивания не обнаруживают жесты смахивания). Затем я сослался на следующие ссылки и переделал,
https://medium.com/@euryperez/android-pearls-detect-swipe-and-touch-over-a-view-203ae2c028dc
https://stackru.com/questions/4139288/android-how-to-handle-right-to-left-swipe-gestures.
Я добавил слушателей жестов к потомку представления Recycler и использовал три метода переопределения onClick(), onSwipeRight() и onSwipeLeft(). Положение onClick получается идеально, но иногда Swipe Listeners не обнаруживаются, что заставляет пользователей чувствовать, что смахивание не является более плавным.
Все, что мне нужно, это сделать сглаживание и определение положения нажатия клавиш без ущерба для обоих. Есть ли способы реализовать эту функцию, если есть способ предложить мне! Вот мой код Заранее спасибо!.
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();
}
});
}
0 ответов
Я подготовил для вас 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");
}
}));
Вот и все! Наслаждаться.