我需要检测我的应用程序何时刷卡,我使用此代码并且工作正常:
private float x1,x2;
static final int MIN_DISTANCE = 150;
并覆盖onTouchEvent()方法:
@Override
public boolean onTouchEvent(MotionEvent event)
{
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
float deltaX = x2 - x1;
if (Math.abs(deltaX) > MIN_DISTANCE)
{
Toast.makeText(this, "left2right swipe", Toast.LENGTH_SHORT).show ();
}
else
{
// consider as something else - a screen tap for example
}
break;
}
return super.onTouchEvent(event);
}
但是,如果我的Activity上有一个scrollView,代码就不再有效了,我怎么可能解决这个问题呢?我是否需要完全更改我使用的代码?
修改 我试图在检测到滑动手势的情况下添加以下方法:
if (getParent() != null) {
getParent().requestDisallowInterceptTouchEvent(true);
}
但我在
上收到错误requestDisallowInterceptTouchEvent
它说我需要添加强制转换为getParent()
答案 0 :(得分:0)
是的,你可以解决这个问题:-)而且你需要做三件事:
您需要将此方法添加到您的活动中,这样您就可以确保onTouchEvent
功能始终拦截此事件:
@Override
public boolean dispatchTouchEvent(MotionEvent event){
this.onTouchEvent(event);
return super.dispatchTouchEvent(event);
}
添加全局布尔变量作为标志。这是因为当有一个ListView时,super.dispatchTouchEvent允许ListView
使用该事件。但是,如果没有ListView
,则上述代码会将同一个滑动事件调度至onTouchEvent
两次(第二次通过super.dispatchTouchEvent
):
boolean swapped = false;
修改onTouchEvent函数以使用交换标志:
@Override
public boolean onTouchEvent(MotionEvent event)
{
if(swapped){
/*Make sure you don't swap twice,
since the dispatchTouchEvent might dispatch your touch event to this function again!*/
swapped = false;
return super.onTouchEvent(event);
}
switch(event.getAction())
{
case MotionEvent.ACTION_DOWN:
x1 = event.getX();
break;
case MotionEvent.ACTION_UP:
x2 = event.getX();
float deltaX = x2 - x1;
if (Math.abs(deltaX) > MIN_DISTANCE)
{
Toast.makeText(this, "left2right swipe", Toast.LENGTH_SHORT).show();
//you already swapped, set flag swapped = true
swapped = true;
}
else
{
// not swapping
}
break;
}
return super.onTouchEvent(event);
}
注意:不要添加帖子中提到的代码,MIN_DISTANCE有点太小,可能会设置为250。