【问题标题】:Android multitouch View.OnTouchListenerAndroid 多点触控 View.OnTouchListener
【发布时间】:2015-03-30 15:36:04
【问题描述】:

我正在尝试在 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,我就可以通过 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 值确定我触及的布局?

【问题讨论】:

    标签: android multi-touch


    【解决方案1】:

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

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

    【讨论】:

    • 我做了一个快速测试,制作了 2 个自定义视图来覆盖 onTouchEvent。如果我触摸并按住一个视图,然后触摸另一个,该事件将不会发送。到目前为止,我看到的所有示例,包括链接似乎都是一个视图中的多点触控。有没有办法让它与多个视图一起工作?
    • 尝试扩展一个视图组,例如相对布局,然后在您的 XML 中将其作为您的根并在其中添加您的视图。在根上实现 onTouchEvent。我认为这样所有子视图都会暴露给多个指针。
    • 所以我必须使用“根”中事件的 x/y 值来确定触摸位于哪个视图中?
    • 是的,你甚至可以通过pointerIds知道哪个指针在哪个视图上
    • 好吧,这就是我害怕的。希望能解决这个问题。感谢您的帮助。
    猜你喜欢
    • 2012-08-11
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多