Android 多点触控 View.OnTouchListener

Android multitouch View.OnTouchListener

我正在尝试在 Android 中使用一些多点触控。

我在屏幕上有两个 RelativeLayout,我想在其中获取触摸事件。

fooLayout = (RelativeLayout)findViewById(R.id.foo);
fooLayout.setOnTouchListener(onTouchListener);

barLayout = (RelativeLayout)findViewById(R.id.bar);
barLayout.setOnTouchListener(onTouchListener);

...

View.OnTouchListener onTouchListener = new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    ...

我尝试为每个布局设置一个 OnTouchListener,但这似乎根本不起作用。

我想既然 onTouch 方法得到了一个视图,我就可以用视图来判断当前的触摸事件来自哪里,并保存指针 ID。

int pointerId = event.getPointerId(event.getActionIndex());
int action = event.getActionMasked();
switch (action) {
     case MotionEvent.ACTION_DOWN:
     case MotionEvent.ACTION_POINTER_DOWN:
          switch (v.getId()) {
               case R.id.foo:
                    fooPointerId = pointerId;
                    break;
               case R.id.bar:
                    barPointerId = pointerId;
                    break;
}

这和我想的不一样。 当我的第一根手指接触其中一个布局时,我将从该布局中获得正确的 ID。但是当我在另一个布局中放下第二根手指时,它将获得我放下第一根手指的布局的 ID。

我是不是做错了?

这是否可行,或者我是否必须将 OnTouchListener 放在顶视图上,并确定我正在按事件的 x/y 值触摸哪个布局?

我认为你应该扩展相对布局并在那里实现 onTouchEvent(MotionEvent ev) 以确定哪些指针正在触摸哪些子视图(将 foo 和 bar 放在实现 onTouchEvent 的主要亲戚 layout/view 组中) .

IMO onTouch(View v, MotionEvent ev) 一次只允许您注册一个指针,因此可能无法使用这种方法。这 link 可能会有所帮助