如何在android中禁用视图的垂直滚动?

时间:2012-07-26 06:32:37

标签: android

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

}

但它也禁止水平滚动。我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:6)

我认为你误解了ACTION_DOWNACTION_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所说)。

希望有所帮助:)