java - 模拟手势
问题描述
我正在尝试使用此方法模拟 Android 中的向右滑动手势:
private void addGestures () {
final int[] x1 = {0};
final int[] x2 = {0};
final int[] y1 = {0};
final int[] y2 = {0};
final int[] t1 = {0};
final int[] t2 = {0};
View myView = findViewById(R.id.detail_activity);
myView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x1[0] = (int)event.getX();
y1[0] = (int) event.getY();
t1[0] = (int) System.currentTimeMillis();
return true;
case MotionEvent.ACTION_UP:
x2[0] = (int) event.getX();
y2[0] = (int) event.getY();
t2[0] = (int) System.currentTimeMillis();
if (x2[0] > x1[0]) {
onBackPressed();
}
return true;
case MotionEvent.ACTION_MOVE:
return true;
}
return false;
}
});
}
问题是现在,只要我触摸屏幕,它就会被识别为手势,并且调用 onBackPressed 方法。我添加了第三个变量来检查用户触摸屏幕的时间。如何实现它们以识别滑动?
解决方案
忘记你做过的事。
将此侦听器添加到您的项目中:
package com.example.testproject.listeners;
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class OnSwipeTouchListener implements 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 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() {
//Called when swiping right to all views that implement the listener
}
public void onSwipeLeft() {
//Called when swiping left to all views that implement the listener
}
public void onSwipeTop() {
//Called when swiping top to all views that implement the listener
}
public void onSwipeBottom() {
//Called when swiping bottom to all views that implement the listener
}
}
然后实现它:
yourView.setOnTouchListener(new OnSwipeTouchListener(this) {
public void onSwipeTop() {
//Called when swiping top on this view
}
public void onSwipeRight() {
//Called when swiping right on this view
}
public void onSwipeLeft() {
//Called when swiping left on this view
}
public void onSwipeBottom() {
//Called when swiping bottom on this view
}
});
这是一个很棒的模块化解决方案!如果您需要根据自己的喜好调整滑动手势,请更改
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
在听者中。
推荐阅读
- javascript - Suitescript 保存的搜索没有重复
- sql-server - T SQL 循环遍历 SQL 命令表并执行每个命令
- mysql - 将行计数结果插入另一个表
- r - 根据第二个数据帧中的日期获取前 n 条记录的平均值
- php - 带 PHP 的 Stripe:付款方式只标记但不收费
- c# - 使用 Microsoft Office Interop Word 插入 Word 文件的 MySql 数据库内容
- javascript - 事件完成后显示隐藏的 div javascript
- javascript - 如何将文本框动态绑定到使用 Highcharts 创建的图表的右边框?
- objective-c - 升级到 XCode 12 后出现奇怪的构建问题
- dart - Dart/Flutter 按位移位运算符返回不同的值