Search code examples
androidtouch-eventmotionevent

OnTouchEvent , my scene go back if i touch some place in scene


my question can be pretty strange, but I can not understand why my scene is moving back, if I touch the screen elsewhere, please help me figure it out.

https://youtu.be/oKdwqn0HC0Y - in this video record my problem, To better understand the problem

 @Override
        public boolean onTouchEvent(MotionEvent event) {
            final int action = event.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                return true;
            }
            switch (event.getPointerCount()) {
                case 3:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return mScaleDetector.onTouchEvent(event);
                case 2:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return doRotationEvent(event);
                case 1:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return doMoveEvent(event);
            }
            return true;
        }

        private boolean doMoveEvent(MotionEvent event)
        {
            final int action = event.getAction();
            Log.e("doMoveEvent", "action = " +action);

            switch (action) {
                case MotionEvent.ACTION_DOWN: {
                    Log.e("doMoveEvent", "action_down");
                    final float x = event.getX();
                    Log.e("doMoveEvent", " x = " +x);
                    final float y = event.getY();
                    Log.e("doMoveEvent", " y = " +y);
                    // Remember where we started
                    mLastTouchX = x;
                    mLastTouchY = y;
                    break;
                }

                case MotionEvent.ACTION_MOVE: {
                    final float x = event.getX();
                    final float y = event.getY();
                        // Calculate the distance moved
                        final float dx = x - mLastTouchX;
                        final float dy = y - mLastTouchY;
                        Log.e("doMoveEvent", " DX = " +dx);
                        Log.e("doMoveEvent", " DY = " +dy);

                        renderer.angleX += dy;
                        renderer.angleY += dx;

                    mLastTouchX = x;
                    mLastTouchY = y;

                    // Invalidate to request a redraw
                    break;
                }

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

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

Solution

  • I solved my problem this way

     @Override
        public boolean onTouchEvent(MotionEvent event) {
            final int action = event.getAction();
            if (action == MotionEvent.ACTION_DOWN) {
                final float x = event.getX();   //(NEW)
                final float y = event.getY();   //(NEW)
    
                mLastTouchX = x;    //(NEW)
                mLastTouchY = y;    //(NEW)
                return true;
            }
            switch (event.getPointerCount()) {
                case 3:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return mScaleDetector.onTouchEvent(event);
                case 2:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return doRotationEvent(event);
                case 1:
                    Log.e("Event", "PointerCount = " +event.getPointerCount());
                    return doMoveEvent(event);
            }
            return true;
        }