Android多点触控帮助 - 一次拖动两个对象

时间:2015-12-12 19:19:11

标签: java android android-studio multi-touch

我的一些朋友正在合作为我们的高中计算机科学年终任务开发应用程序。我们正在改造乒乓球比赛。我正在开发Android版本,两个正在开发iOS版本。到目前为止,一切进展顺利,我们在课堂上使用的主要语言是Python,因此过渡到Java已经是一个学习曲线。

我正在努力拖动两个拨片。我在这里以及Android开发者页面上阅读了很多帖子,大部分代码都来自那里,但我无法理解。当一个指针在设备上时,两个拨片都拖得很好,但是一旦第二个指针到达屏幕,它就会忽略第一个指针,只使用第二个指针,直到它被释放。这是我的代码......

    private final static int INVALID_POINTER_ID = -1;
    private int mActivePointerId = INVALID_POINTER_ID;

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

        switch (action) {

            case MotionEvent.ACTION_DOWN: {
                final int pointerIndex = MotionEventCompat.getActionIndex(ev);
                mLastTouchX1 = MotionEventCompat.getX(ev, pointerIndex);
                mActivePointerId = MotionEventCompat.getPointerId(ev, 0);
                break;
            }

            case MotionEvent.ACTION_POINTER_DOWN:{
                final int pointerIndex = MotionEventCompat.getActionIndex(ev);
                if (pointerIndex == 1) {
                    mLastTouchX1 = MotionEventCompat.getX(ev, pointerIndex);
                }
                mActivePointerId = MotionEventCompat.getPointerId(ev, pointerIndex);
            }


            case MotionEvent.ACTION_MOVE: {
                final int pointerIndex =
                        MotionEventCompat.findPointerIndex(ev, mActivePointerId);


                    final float x = MotionEventCompat.getX(ev, pointerIndex);
                    final float y = MotionEventCompat.getY(ev, pointerIndex);

                    final float deltaX = x - mLastTouchX1;
                    paddle1.update(deltaX, screenX, y, screenY);
                    paddle2.update(deltaX, screenX, y, screenY);


                    mLastTouchX1 = x;

                    invalidate();
                    break;
                }

            case MotionEvent.ACTION_UP: {
                break;
            }
            case MotionEvent.ACTION_CANCEL: {
                break;
            }

            case MotionEvent.ACTION_POINTER_UP:{
                final int pointerIndex = MotionEventCompat.getActionIndex(ev);
                final int pointerId = MotionEventCompat.getPointerId(ev, 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;
                    mLastTouchX2 = MotionEventCompat.getX(ev, newPointerIndex);
                    mActivePointerId = MotionEventCompat.getPointerId(ev, newPointerIndex);
                }
                break;
            }
        }

Paddle1和paddle2是我的paddle类的实例。这是我在课堂上的更新方法。

public void update ( float x, int screenX, float y, int screenY){
    if (y > screenY / 2){
        rect1.left = rect1.left + x;
        rect1.right = rect1.left + length;
        if (rect1.left < 0 ){
            rect1.left=0;
            rect1.right = rect1.left + length;
        }
        if (rect1.right > screenX){
            rect1.left = screenX - length;
            rect1.right = screenX;
        }
    }
    else{
        rect2.left = rect2.left + x;
        rect2.right = rect2.left + length;
        if (rect2.left < 0 ){
            rect2.left=0;
            rect2.right = rect2.left + length;
        }
        if (rect2.right > screenX){
            rect2.left = screenX - length;
            rect2.right = screenX;
        }
    }

我意识到我的代码可能很草率,但我的最终目标是能够同时移动两个拨片。如果有人能告诉我我需要添加或调整到那里那将是伟大的。

谢谢。

修改:使用Android Studio。

1 个答案:

答案 0 :(得分:1)

搜索网络并找到关于你问题的好文章, vogella.com/tutorials/AndroidTouch/article.html 下一次在您提出问题之前在谷歌上进行快速搜索。阅读互联网是一个充满信息的大地方;)