Ошибка в жесте MultiTouch Sliding - PullRequest
       49

Ошибка в жесте MultiTouch Sliding

0 голосов
/ 16 октября 2019

Я хочу реализовать на Android скользящий жест MultiTouch, который работает только тогда, когда на экране ровно два пальца. Если пользователь перемещает свои пальцы вправо, значение увеличивается, а если он перемещает их влево, оно уменьшается. Код, который я использовал, выглядит следующим образом:

public boolean onTouchEvent(MotionEvent event) {
        super.onTouchEvent(event);

        int action = event.getAction() & MotionEvent.ACTION_MASK;
        switch(action) {
            // Pulsamos
            case MotionEvent.ACTION_DOWN: {
                break;
            }
            // Movemos
            case MotionEvent.ACTION_MOVE:   {
                if (gestureStarted){
                    // Calculate new pointers positions
                    pointer0NewPos = new PointF(event.getX(event.findPointerIndex(pointer0Id)),
                            event.getY(event.findPointerIndex(pointer0Id)));
                    pointer1NewPos = new PointF(event.getX(event.findPointerIndex(pointer1Id)),
                            event.getY(event.findPointerIndex(pointer1Id)));

                    // Calculate difference in position
                    float pointer0_diff_x = pointer0NewPos.x - pointer0Pos.x; // Last x position of pointer 0
                    float pointer1_diff_x = pointer1NewPos.x - pointer1Pos.x; // Last y position of pointer 1

                    float desp_x;

                    // Desp_x is the average of the two pointers movements
                    desp_x = (pointer0_diff_x + pointer1_diff_x) / 2.0f;

                    int year_inc;

                    if (Math.abs(desp_x) > thresholdDespX) // Check if the movement is large enough
                        year_inc = (int)(desp_x*yearChangeFactor);
                    else
                        year_inc = 0;

                    indexYear += year_inc; // Increment/decrement var

                    if (indexYear > maxYear)
                        indexYear = maxYear;
                    else if (indexYear < minYear)
                        indexYear = minYear;

                    // Save new pointers positions
                    pointer0Pos = pointer0NewPos;
                    pointer1Pos = pointer0NewPos;
                }

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

            case MotionEvent.ACTION_POINTER_DOWN: {
                if (event.getPointerCount() == 2 && !gestureStarted) {
                    // Save pointers positions
                    pointer0Id = event.getPointerId(0);
                    pointer0Pos = new PointF(event.getX(0), event.getY(0));
                    pointer1Id = event.getPointerId(1);
                    pointer1Pos = new PointF(event.getX(1), event.getY(1));

                    // Start gesture logic
                    gestureStarted = true;
                }
                else if (gestureStarted) { // Cancel gesture if a third pointer is down
                    gestureStarted = false;
                }

                break;
            }
            case MotionEvent.ACTION_POINTER_UP:   {
                // Reset gesture
                if (gestureStarted) {
                    gestureStarted = false;
                }

                break;
            }

            case MotionEvent.ACTION_CANCEL:{
                gestureStarted = false;

                break;
            }

        }

        return true;
    }

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

Работает, хотя глючит . Иногда, если я перемещаю пальцы вправо, переменная не увеличивается, а уменьшается, и если пальцы остаются в том же положении на экране, иногда переменная все еще перемещается.

Возможно, проблема связана с вычислением скорости только из двух позиций вместо использования большей партии позиций, но я не уверен. Как вы думаете, я могу решить эту проблему?

...