1

在我的 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);
    }

}

但它也禁用水平滚动。我该如何解决这个问题?

4

2 回答 2

6

我认为您误解了ACTION_DOWNand的概念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;
}
于 2012-07-26T07:08:12.537 回答
1

我不确定这应该如何用于全景视图,但对于其他视图,我使用 GestureDetector 来捕捉滚动/甩动运动(我通常使用甩动,因为滚动是一个非常短的运动):

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 所说)。

希望能帮助到你:)

于 2012-07-26T07:17:57.870 回答