0

我想做以下任何一项。

1) 只允许在我的视图上滑动/滑动并禁用单击、长按和其他事件。

或者

2)在我的视图之上覆盖另一个视图,只允许滑动/甩动/滚动事件传递到它下面的视图。

是否有可能在Android中做到这一点?

4

2 回答 2

0

使用示例GetureDetector

public class Main extends Activity implements OnGestureListener {
    private GestureDetector gDetector;
    TextView ViewA;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    gDetector = new GestureDetector(this);
    ViewA = (TextView)findViewById(R.id.txtView);

}
 @Override
public boolean onTouchEvent(MotionEvent me) {
    return gestureScanner.onTouchEvent(me);
}

@Override
public boolean onDown(MotionEvent e) {
    viewA.setText("-" + "DOWN" + "-");
    return true;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    viewA.setText("-" + "FLING" + "-");
    return true;
}

@Override
public void onLongPress(MotionEvent e) {
    viewA.setText("-" + "LONG PRESS" + "-");
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    viewA.setText("-" + "SCROLL" + "-");
    return true;
}

@Override
public void onShowPress(MotionEvent e) {
    viewA.setText("-" + "SHOW PRESS" + "-");
}    

@Override
public boolean onSingleTapUp(MotionEvent e) {
    viewA.setText("-" + "SINGLE TAP UP" + "-");
    return true;
}

}

以下是在 GestureDetector 类下使用触摸事件的方法。您可以控制每个事件。
希望对你有所帮助。

于 2013-04-15T14:08:07.300 回答
0

我找到了一个适合我的情况的 hacky 解决方案,但它显然是一个 hack。在 ViewGroup 的 onInterceptTouchEvent 中,如果之前有 MotionEvent.ACTION_DOWN 事件,我会吃掉所有的 MotionEvent.ACTION_UP。吃我的意思是我会从函数中返回true,并且动作取消将被发送到子视图,该子视图获得初始向下事件,因此点击将被忽略。然而,卷轴、甩动等按预期工作。

如果有人尝试这样做,则为代码示例。这里 lastMotionDown 是一个类级别的布尔变量。


public boolean onInterceptTouchEvent(MotionEvent e) {

            if (this.lastMotionDown) {
                if (e.getAction() == MotionEvent.ACTION_DOWN) {
                    this.lastMotionDown = true;
                    return false;
                }
                this.lastMotionDown = false;
                if (e.getAction() == MotionEvent.ACTION_UP) {
                    //A click has happened prevent it.
                    return true;
                }
            }else {
                if (e.getAction() == MotionEvent.ACTION_DOWN) {
                    this.lastMotionDown = true;
                }
                return false;
            }
            return false;
}
于 2013-04-17T13:11:26.187 回答