Java Android 2指触摸触发1指触摸和2指触摸

Java Android 2指触摸触发1指触摸和2指触摸,java,android,multi-touch,touch-event,Java,Android,Multi Touch,Touch Event,我的应用程序中有一个问题,我需要根据是否按下一个手指或两个手指执行不同的操作 目前我有以下代码: @Override public boolean onTouchEvent(MotionEvent event){ int touchX = (int)event.getX(); int touchY = (int)event.getY(); int action = event.getActionMasked();

我的应用程序中有一个问题,我需要根据是否按下一个手指或两个手指执行不同的操作

目前我有以下代码:

    @Override
    public boolean onTouchEvent(MotionEvent event){
        int touchX = (int)event.getX();
        int touchY = (int)event.getY();
        int action = event.getActionMasked();

        //Multitouch
        if(event.getPointerCount() > 1 && action == MotionEvent.ACTION_POINTER_DOWN){
            System.out.println("2 Finger press");

            return true;
        }
        else if(action == MotionEvent.ACTION_DOWN && action != MotionEvent.ACTION_POINTER_DOWN){

            if(event.getPointerCount() == 1) {
                System.out.println("single finger down");
                invalidate();
                return true;
            }
        }

        return false;
    }
我遇到的问题是,当我用两个手指按压时,多点触控部分会注册,然后单次按压也会注册

我在谷歌上搜索了一些方法来解决这个问题,这就是为什么我要检查单触式条件,即
action!=MotionEvent.ACTION\u POINTER\u DOWN
,我认为这会解决问题。这并没有解决问题,因此我决定检查
event.getPointerCount()==1
,但不幸的是,当我用两个手指按下时,仍然会导致两行打印


总而言之,我只需要在按下两个手指时调用两个手指部分,而不是同时按下两个手指

请参阅有关“”的文档。它详细说明了你要找的东西

本质上,每个活动指针在与屏幕接触时都会被分配一个ID。您的解决方案应该通过观察各种操作状态来考虑哪些ID起作用,哪些ID被删除

这方面有点类似(但要注意对
getActionIndex()
等方法的兼容性调用):

更新的代码示例


请参阅有关“”的文档。它详细说明了你要找的东西

本质上,每个活动指针在与屏幕接触时都会被分配一个ID。您的解决方案应该通过观察各种操作状态来考虑哪些ID起作用,哪些ID被删除

这方面有点类似(但要注意对
getActionIndex()
等方法的兼容性调用):

更新的代码示例


我将不得不重新阅读关于这一点的文档,并找出如何做到这一点。我相信您的示例代码是错误的,但是,它根本没有注册2次手指按压。我认为这是由secondaryPointerId=-1引起的,这意味着在接收到
MotionEvent.action\u POINTER\u DOWN
的操作时,永远不会满足多点触摸条件
secondaryPointerId
。我关于如何引用正确的动作索引的机制可能不正确(我在记忆中写下了这一点),但要点是正确的。如果
secondaryPointerId
==-1,那是因为表面上有一个(或没有)手指。我一直在仔细研究,问题是
案例运动事件。实际从未输入操作指针,我还不知道原因,但除此之外,我认为这是正确的。我明白你说的第二个指针的意思了。我的代码示例的问题是,我愚蠢地用指针ID作为方法作用域变量来编写它。相反,它们应该是成员变量。我粘贴了一个更新的工作版本。对不起!很乐意帮忙!不过,一定要阅读文档。它解释了有关如何管理指针ID的重要框架行为,例如,当第一个指向touch的指针也是第一个发布的指针时,等等。我必须重新阅读有关该操作的文档,并确定如何执行该操作。我相信您的示例代码是错误的,但是,它根本没有注册2次手指按压。我认为这是由secondaryPointerId=-1引起的,这意味着在接收到
MotionEvent.action\u POINTER\u DOWN
的操作时,永远不会满足多点触摸条件
secondaryPointerId
。我关于如何引用正确的动作索引的机制可能不正确(我在记忆中写下了这一点),但要点是正确的。如果
secondaryPointerId
==-1,那是因为表面上有一个(或没有)手指。我一直在仔细研究,问题是
案例运动事件。实际从未输入操作指针,我还不知道原因,但除此之外,我认为这是正确的。我明白你说的第二个指针的意思了。我的代码示例的问题是,我愚蠢地用指针ID作为方法作用域变量来编写它。相反,它们应该是成员变量。我粘贴了一个更新的工作版本。对不起!很乐意帮忙!不过,一定要阅读文档。它解释了有关如何管理指针ID的重要框架行为,例如,当第一个指向touch的指针也是第一个释放的指针时,等等。
public class MotionActivity extends AppCompatActivity {

    private int primaryPointerId   = -1;
    private int secondaryPointerId = -1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(new FrameLayout(this));
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        int action = event.getActionMasked();

        switch(action) {
            case MotionEvent.ACTION_DOWN:
                primaryPointerId = event.getPointerId(0);

                Log.d(getClass().getName(), "Primary pointer ID == [" + primaryPointerId + "]");

                break;

            case MotionEvent.ACTION_POINTER_DOWN:
                secondaryPointerId = event.getPointerId(event.getActionIndex());

                Log.d(getClass().getName(), "Secondary pointer ID == [" + secondaryPointerId + "]");

                break;

            case MotionEvent.ACTION_MOVE:
                if(primaryPointerId > -1 && secondaryPointerId > -1) {
                    Log.d(getClass().getName(), "Two-point touch...");
                } else {
                    Log.d(getClass().getName(), "One-point touch...");
                }

                break;

            case MotionEvent.ACTION_POINTER_UP:
                if(event.getPointerId(event.getActionIndex()) == primaryPointerId) {
                    primaryPointerId = secondaryPointerId;
                }

                secondaryPointerId = -1;

                break;

            case MotionEvent.ACTION_UP:
                primaryPointerId = -1;

                break;
        }

        return true;
    }
}