Я пытаюсь использовать Скроллер для перехода в фиксированное положение. Моя проблема заключается в том, что она заканчивается в правильном положении, но она либо просто запускается один раз, либо сразу устанавливает конечную позицию, либо сначала прокручивается очень медленно, а затем перескакивает до конца.Android Scroller перешел в фиксированное положение
EDIT: проблема, кажется, что а) моя скорость равна нулю, иногда (это проблема где-то еще :)) и что я должен продлить срок с помощью scroller.extendDuration()
. Однако я не уверен, что такое продолжительность. Я не могу найти никакой информации о том, что означает определенная скорость. Это пикселы в секунду?
Вот мой код:
private class Flinger implements Runnable {
private final Scroller scroller;
private int lastX = 0;
public Flinger() {
scroller = new Scroller(getContext());
}
void startFling(int initialVelocity, int offsetX) {
Log.d("test", "finalX = " + offsetX);
if (offsetX > 0) {
scroller.fling(0, 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0);
scroller.setFinalX(offsetX);
lastX = 0;
} else {
scroller.fling(getWidth(), 0, initialVelocity, 0, 0, Integer.MAX_VALUE, 0, 0);
scroller.setFinalX(getWidth() + offsetX);
lastX = getWidth();
}
post(this);
}
@Override
public void run() {
if (scroller.isFinished()) {
Log.d("test", "scroller finished");
return;
}
boolean more = scroller.computeScrollOffset();
int x = scroller.getCurrX();
int diff = lastX - x;
Log.d("test", "isFlinging, x=" + x + ", diff=" + diff + ", leftOffset=" + getLeftOffset() + ", isDone=" + !more);
if (diff != 0) {
setLeftOffset(getLeftOffset() - diff);
lastX = x;
}
if (more) {
post(this);
}
}
}
Как вы вычисления скорости, а также вы делаете это прокруткой функциональность на взаимодействие с пользователем, как прикосновение двигаться – Triode
Как вы вычисления скорости, а также вы делаете это прокруткой функциональность на взаимодействие с пользователем, как сенсорный шаг если это так, то почему вы не можете использовать что-то вроде этого final int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); новыйX - текущая позиция мыши. А также вы можете использовать ускоритель скорости, чтобы проверить скорость движения касания. – Triode
Да, я использую VelocityTracker, но я выяснил, в чем проблема (см. Ответ ниже). Благодаря! –