Sto provando a usare uno scroller per lanciarlo in una posizione fissa. Il mio problema è: finisce nella posizione corretta, ma è solo in esecuzione una volta e impostando la posizione finale immediatamente o scorre molto lentamente prima e poi salta alla fine.Android Scroller si lancia in posizione fissa
EDIT: il problema sembra essere che a) la mia velocità è a volte zero (questo è un problema da qualche altra parte :)) e che devo estendere la durata usando scroller.extendDuration()
. Tuttavia non sono sicuro di quale dovrebbe essere la durata. Non riesco a trovare informazioni su ciò che una determinata velocità in realtà significa. È pixel al secondo?
Ecco il mio codice:
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);
}
}
}
Come si sta calcolando la velocità, e anche state facendo questa funzionalità di scorrimento su interazione con l'utente, come il tocco spostare – Triode
Come si sta calcolando la velocità, e anche state facendo questa funzionalità di scorrimento su interazione con l'utente, come il tocco mossa se questo è il caso, allora perché non puoi usare una cosa come questa finale int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); newX è la posizione corrente del mouse su. Inoltre, puoi utilizzare Velocity Tracker per controllare la velocità di spostamento del tocco. – Triode
Sì, sto usando un VelocityTracker, ma ho capito quale fosse il problema (vedi risposta sotto). Grazie! –