Scroller.fling () не работает должным образом - PullRequest
0 голосов
/ 16 октября 2018

Это код, который я использую для получения сенсорных событий и передачи их в x, y, которые мой холст использует для перевода:

VelocityTracker mVelocity;
Scroller scroller;

@Override
public boolean onTouchEvent(MotionEvent event) { //On touch
    super.onTouchEvent(event);

    mVelocity = VelocityTracker.obtain();
    mVelocity.addMovement(event);

    //Log.d("VELOCITY","("+mVelocity.getXVelocity()+","+mVelocity.getYVelocity()+")");

    if(event.getActionMasked()==MotionEvent.ACTION_MOVE){ //If it's a drag, call scrollMove
        mVelocity.computeCurrentVelocity(1);
        scrollMove();
    }

    if(event.getActionMasked()==MotionEvent.ACTION_UP) { //or scrollFling
        mVelocity.computeCurrentVelocity(1);
        scrollFling();
    }

    mVelocity.recycle();

    return true;
}

void scrollMove(){ //Canvas is constantly translating by (scrollMove.x,scrollMove.y) every time invalidate() is called
    scrollMove.x += mVelocity.getXVelocity() * 10f;
    scrollMove.y += mVelocity.getYVelocity() * 10f;
    invalidate();
}

void scrollFling(){ //how does scroller.fling work?
    scroller.fling(getScrollX(),getScrollY(),(int)-mVelocity.getXVelocity(),(int)-mVelocity.getYVelocity(),0,0,10000,10000);
    invalidate();
}


@Override
public void computeScroll() {
    super.computeScroll();
    if(!scroller.isFinished()){
        scroller.computeScrollOffset();
        scrollMove.x += scroller.getCurrX();
        scrollMove.y += scroller.getCurrY();
        //postInvalidateOnAnimation();
        postInvalidateOnAnimation(); //Alternated between all 3 of these
        postInvalidate(); //??
        invalidate(); //??
        Log.d("FLING","Should be flinging"); //This is only called once
    }
}

Ссылка на видео о поведении

Так что прокрутка работает так, как я ожидал, но бросание - нет.В то время как метод scroll постоянно вызывается для возврата значений и преобразования холста, fling вызывается только один раз и возвращает любое максимальное значение, которое я положил в вызов функции.

Я думал, что scroller.fling / computeScroll был рекурсивнымперезвоните каждый кадр, и пока бросок не закончится, я собираюсь получить информацию о том, куда перевести мою точку зрения?Что я делаю не так?

1 Ответ

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

(спасибо @Roughy из irc.freenode / android-dev)

Первая проблема заключается в том, что вы передаете неправильные значения .fling ()

    scroller.fling(startX, startY, velX, velY, minX, MAXX, MINY, MAXY);

Вы переключили мин / макс вокруг.

Вторая проблема заключается в том, что вы звоните mVelocity = VelocityTracker.obtain(); каждый раз, когда у вас есть изменение события движения, которое создает новый трекер скорости для каждого кадра движения, вы должны вызвать еготолько один раз на MotionEvent.ACTION_DOWN, а затем вызовите mVelocity.addMovement(event); на ACTION_MOVE и ACTION_UP.

Также вызовите mVelocity.recycle(); на ACTION_UP.

...