Это код, который я использую для получения сенсорных событий и передачи их в 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 был рекурсивнымперезвоните каждый кадр, и пока бросок не закончится, я собираюсь получить информацию о том, куда перевести мою точку зрения?Что я делаю не так?