Как кодировать для мультитач

Итак, я разрабатываю приложение, которое должно обрабатывать мультитач. Обычно мне нужно одно касание для вращения (это не проблема). И мультитач для прокрутки.

У меня есть базовый код, но у меня возникают проблемы, когда происходит переход с одиночного на мультитач и наоборот. В основном движение будет трясти, потому что среднее положение мультитач (два пальца) и абсолютное положение одиночного пальца находятся на расстоянии. Итак, если у меня два пальца на экране, они составляют среднюю позицию, а затем поднимают один палец, это было бы похоже на быстрое перемещение из этого среднего положения в абсолютное положение одного пальца. Это будет движение, которое мне не нужно.

Это мой код:

@Override
public boolean onTouchEvent( MotionEvent event ) {
    float xEvent[] = new float[ 2 ];
    float yEvent[] = new float[ 2 ];
    switch( event.getPointerCount() ) {
        case 1:
            xEvent[ 0 ] = event.getX( 0 );
            yEvent[ 0 ] = event.getY( 0 );
            switch( event.getAction() ) {
                case MotionEvent.ACTION_DOWN:
                    camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                case MotionEvent.ACTION_MOVE:
                    camera.onTouchRotate( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                default: return super.onTouchEvent( event );
            }
        case 2:
            xEvent[ 0 ] = event.getX( 0 );
            yEvent[ 0 ] = event.getY( 0 );
            xEvent[ 1 ] = event.getX( 1 );
            yEvent[ 1 ] = event.getY( 1 );
            switch( event.getAction() ) {
                case MotionEvent.ACTION_DOWN:
                    camera.onTouchDown( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) );
                    return true;
                case MotionEvent.ACTION_MOVE:
                    camera.onTouchSlide( ( ( xEvent[ 0 ] + xEvent[ 1 ] ) / 2 ), ( ( yEvent[ 0 ] + yEvent[ 1 ] ) / 2 ) );
                    return true;
                case MotionEvent.ACTION_POINTER_1_UP:
                    camera.onTouchDown( xEvent[ 1 ], yEvent[ 1 ] );
                    return true;
                case MotionEvent.ACTION_POINTER_2_UP:
                    camera.onTouchDown( xEvent[ 0 ], yEvent[ 0 ] );
                    return true;
                default: return super.onTouchEvent( event );
            }
        default: return false;
    }
}

Функция камеры onTouchDown просто устанавливает первое значение сенсорного перемещения. Вот почему я также использую его в движении вверх, чтобы установить новое начальное значение для движения одним касанием при использовании мультитач.

Надеюсь, кто-то знает, в чем моя проблема, и может помочь мне в дальнейшем.

8
задан Daniel Smith 28 February 2013 в 23:56
поделиться