Android:如何仅允许一次触摸?

3

如何在 Android 上只允许一次触摸?我不想支持多点触摸,并且如果我的一个手指已经触摸屏幕,我希望我的应用程序放弃其他触摸。这就像在 iOS 上使用专有触摸。

另外,是否有一种方法可以设置允许的触摸数?

谢谢!

编辑:最低目标 API = 8。

2个回答

3

您可以通过使用 android:splitMotionEvents="false" 或者 android:windowEnableSplitTouch="false" 来禁用多点触控。


不确定这是否有效。但它需要 API 级别在 11 及以上。 - asloob
我所针对的最低版本是API 10。 - dzep

2

你需要追踪第一个触摸的指针id,并仅使用与该触摸相对应的触摸事件。以下是来自Android官方博客“理解多点触控”的好例子

private static final int INVALID_POINTER_ID = -1;

// The ‘active pointer’ is the one currently moving our object.
private int mActivePointerId = INVALID_POINTER_ID;

// Existing code ...

@Override
public boolean onTouchEvent(MotionEvent ev) {
    final int action = ev.getAction();
    switch (action & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN: {
        final float x = ev.getX();
        final float y = ev.getY();

        mLastTouchX = x;
        mLastTouchY = y;

        // Save the ID of this pointer
        mActivePointerId = ev.getPointerId(0);
        break;
    }

    case MotionEvent.ACTION_MOVE: {
        // Find the index of the active pointer and fetch its position
        final int pointerIndex = ev.findPointerIndex(mActivePointerId);
        final float x = ev.getX(pointerIndex);
        final float y = ev.getY(pointerIndex);

        final float dx = x - mLastTouchX;
        final float dy = y - mLastTouchY;

        mPosX += dx;
        mPosY += dy;

        mLastTouchX = x;
        mLastTouchY = y;

        invalidate();
        break;
    }

    case MotionEvent.ACTION_UP: {
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_CANCEL: {
        mActivePointerId = INVALID_POINTER_ID;
        break;
    }

    case MotionEvent.ACTION_POINTER_UP: {
        // Extract the index of the pointer that left the touch sensor
        final int pointerIndex = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) 
                >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
        final int pointerId = ev.getPointerId(pointerIndex);
        if (pointerId == mActivePointerId) {
            // This was our active pointer going up. Choose a new
            // active pointer and adjust accordingly.
            final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
            mLastTouchX = ev.getX(newPointerIndex);
            mLastTouchY = ev.getY(newPointerIndex);
            mActivePointerId = ev.getPointerId(newPointerIndex);
        }
        break;
    }
    }

    return true;
}

我尝试了这个,我在我的活动中添加了它,但它无法识别来自活动内部的片段的触摸。我应该怎么做?谢谢! - dzep
我曾试图通过使用我设置ontouchlistener的对象的id来实现这一点,但这让我陷入了麻烦。这很完美。 - b15
那么,在IOS中,你说“view.isExclusiveTouch = true;”...而在Android中,你必须使用上面的代码吗?我拒绝相信这一点。 - Nerdy Bunz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接