在我的android应用程序中。我有一个全景视图,在这个视图中我想避免只有垂直滚动。所以我使用onTouchEvent(MotionEvent event)
方法禁用了它。
听到的是代码。
@Override
public boolean onTouchEvent(MotionEvent event) {
if( event.getAction()==MotionEvent.ACTION_UP){
Log.d(TAG, "onTouchEvent:ACTION_UP");
return false;
}else if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.d(TAG, "onTouchEvent:ACTION_DOWN");
return false;
}else{
Log.d(TAG, "onTouchEvent:ACTION_UNKWON");
return super.onTouchEvent(event);
}
}
但它也禁止水平滚动。我怎么能解决这个问题?
答案 0 :(得分:6)
我认为你误解了ACTION_DOWN
和ACTION_UP
的概念。
ACTION_DOWN
表示当您的手指触摸触摸屏时,ACTION_UP
是指您从触摸屏上抬起手指。
也就是说,你可以在ACTION_DOWN
中指出运动事件已经开始,从坐标中检查ACTION_MOVE
触摸事件的方向,并决定是否要阻止运动,以及在ACTION_UP
重置您的变量。
float startX
float startY;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float currentX = event.getX();
float currentY = event.getY();
float diffX = Math.abs(currentX - startX);
float diffY = Math.abs(currentY - startY);
// The purpose of the +100 is to make sure that we have a big enough
// difference between the 2 directions, eg. it's not diagonal
if(diffY > diffX + 100){
return false;
}
break;
case MotionEvent.ACTION_POINTER_UP:
break;
}
return true;
}
答案 1 :(得分:1)
我不确定这应该如何适用于全景视图,但对于其他视图我使用GestureDetector来捕捉滚动/拖动动作(我通常使用fling,因为滚动是一个非常短的动作):
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY){
if (Math.abs(distanceY) > Math.abs(distanceX))
return true;// mark the vertical scroll as handled and do nothing
return false;
}
另一种选择是使用onTouchEvent,但是在ACTION_MOVE中你必须检测何时有一个垂直滚动(如paradx所说)。
希望有所帮助:)