Android多点触控View.OnTouchListener

时间:2015-03-30 15:36:04

标签: android multi-touch

我试图在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方法获得了一个View,我可以通过查看当前触摸事件的来源并保存指针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值的布局?

1 个答案:

答案 0 :(得分:0)

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

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