Android GestureDetector不会捕获所有运动事件
我对安卓开发还很陌生。我正在尝试制作一个应用程序,从触摸屏数据中捕捉用户的刷卡行为。我遵循了Android中“检测所有支持的手势”一节中的代码示例。当我使用该应用程序时,我可以看到记录器输出对我的触摸输入响应良好。具体而言,在onScroll函数中,我有一行:Android GestureDetector不会捕获所有运动事件,android,motionevent,Android,Motionevent,我对安卓开发还很陌生。我正在尝试制作一个应用程序,从触摸屏数据中捕捉用户的刷卡行为。我遵循了Android中“检测所有支持的手势”一节中的代码示例。当我使用该应用程序时,我可以看到记录器输出对我的触摸输入响应良好。具体而言,在onScroll函数中,我有一行: Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString()); 正如预期的那样,它向我展示了连接的两个事件。这是一个ACTION_DOWN事件和一个ACTI
Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
正如预期的那样,它向我展示了连接的两个事件。这是一个ACTION_DOWN事件和一个ACTION_MOVE事件,我猜它们分别代表了开始刷卡的点和最后注册的点
问题是:在所有函数中,我只是简单地将MotionEvent添加到ArrayList中,目的是捕获活动的所有事件,最后,当用户单击按钮时,我想对事件列表执行一些操作。我尝试在这一点上进行调试(即onClick),以检查ArrayList的状态,我注意到它缺少所有的ACTION\u MOVE事件,即来自onScroll的event2,记录器在前面正确显示了它
我对此感到非常困惑。我错过了什么?为什么我不能捕获记录器显示的所有事件?这是活动生命周期导致的问题吗?我的代码粘贴在下面。谢谢你的帮助
public class MainActivity extends AppCompatActivity implements
GestureDetector.OnGestureListener,
GestureDetector.OnDoubleTapListener {
private static final String DEBUG_TAG = "MyGestures";
private static final String LOG_TAG = "MyLogs";
private GestureDetectorCompat mDetector;
private ArrayList<MotionEvent> activityData;
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Instantiate the gesture detector with the
// application context and an implementation of
// GestureDetector.OnGestureListener
mDetector = new GestureDetectorCompat(this, this);
// Set the gesture detector as the double tap
// listener.
mDetector.setOnDoubleTapListener(this);
activityData = new ArrayList<>();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
this.mDetector.onTouchEvent(event);
// Be sure to call the superclass implementation
return super.onTouchEvent(event);
}
@Override
public boolean onDown(MotionEvent event) {
Log.d(DEBUG_TAG, "onDown: " + event.toString());
activityData.add(event);
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,
float velocityX, float velocityY) {
Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString());
activityData.add(event1);
activityData.add(event2);
return true;
}
@Override
public void onLongPress(MotionEvent event) {
Log.d(DEBUG_TAG, "onLongPress: " + event.toString());
activityData.add(event);
}
@Override
public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) {
Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString());
activityData.add(event1);
activityData.add(event2);
return true;
}
@Override
public void onShowPress(MotionEvent event) {
Log.d(DEBUG_TAG, "onShowPress: " + event.toString());
activityData.add(event);
}
@Override
public boolean onSingleTapUp(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString());
activityData.add(event);
return true;
}
@Override
public boolean onDoubleTap(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString());
activityData.add(event);
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent event) {
Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString());
activityData.add(event);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent event) {
Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString());
activityData.add(event);
return true;
}
public void onClickNext(View view) {
JSONObject tester = new JSONObject();
try {
tester = eventsToJson(activityData);
} catch (JSONException e) {
e.printStackTrace();
}
String urlString = getString(R.string.server_url);
new PostRequestHandler(this).execute(tester.toString(), urlString);
//TODO: Handle response
}
private JSONObject eventsToJson(ArrayList<MotionEvent> activityData) throws JSONException {
JSONObject userEventsObj = new JSONObject();
JSONArray userEvents = new JSONArray();
for (MotionEvent event : activityData) {
JSONObject temp = new JSONObject();
temp.put("Action", event.getAction());
temp.put("X", (int) event.getX());
temp.put("Y", (int) event.getY());
temp.put("EventTime", event.getEventTime());
temp.put("DownTime", event.getDownTime());
userEvents.put(temp);
}
userEventsObj.put("UserEvents", userEvents);
return userEventsObj;
}
}
试试这个
@Override
public boolean onTouchEvent(MotionEvent event) {
this.mDetector.onTouchEvent(event);
// Be sure to call the superclass implementation
if(event.action == MotionEvent.ACTION_MOVE){
Log.d("here");
}
return super.onTouchEvent(event);
}
试试这个
@Override
public boolean onTouchEvent(MotionEvent event) {
this.mDetector.onTouchEvent(event);
// Be sure to call the superclass implementation
if(event.action == MotionEvent.ACTION_MOVE){
Log.d("here");
}
return super.onTouchEvent(event);
}
我建议你采取一些小的步骤并尝试一下。很可能你会找到你的解决方案。你能在日志中公布你得到了什么吗?谢谢。我已经用部分日志更新了这个问题。如您所见,有一个ACTION_MOVE事件,但我无法将其添加到列表中。请尝试对onScroll的日志进行注释并检查..@Shubham在这种情况下,日志记录器仅显示3个事件:onDown、onShowPress和onFlingI建议采取小步骤并尝试。很可能你会找到你的解决方案。你能在日志中公布你得到了什么吗?谢谢。我已经用部分日志更新了这个问题。如您所见,有一个ACTION_MOVE事件,但我无法将其添加到列表中。请尝试对onScroll的日志进行注释并检查..@Shubham。在这种情况下,日志记录器仅显示3个事件:onDown、onShowPress和onFlingHmm。我这样做了,记录器显示了我预期的动作和移动事件。但是,如果我再次尝试添加到我的列表中,我在调试时不会在列表中得到这些事件。但是,因为在你的情况下onScroll是可用的,我认为ActionMove不会起作用。但这仍然是我的直觉。我这样做了,记录器显示了我预期的动作和移动事件。但是,如果我再次尝试添加到我的列表中,我在调试时不会在列表中得到这些事件。但是,因为在你的情况下onScroll是可用的,我认为ActionMove不会起作用。但这仍然是我的直觉。