Estoy tratando de utilizar un Scroller para arrojar a una posición fija. Mi problema es que termina en la posición correcta, pero o bien se ejecuta una vez y establece la posición final de inmediato o se desplaza muy lentamente primero y luego salta hasta el final.Android Scroller arrojar a la posición fija
EDIT: el problema parece ser que a) mi velocidad es cero veces (que es un problema en otro lugar :)) y que tengo para extender la duración utilizando scroller.extendDuration()
. Sin embargo, no estoy seguro de cuál debería ser la duración. No puedo encontrar información sobre lo que realmente significa cierta velocidad. ¿Es píxeles por segundo?
Aquí está mi código:
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);
}
}
}
¿Cómo se está calculando la velocidad, y también estás haciendo esta funcionalidad a desplazarse en la interacción del usuario, como el tacto mover – Triode
¿Cómo se está calculando la velocidad, y también estás haciendo esta funcionalidad a desplazarse en la interacción del usuario, como el tacto movimiento si ese es el caso, entonces por qué no puede usar algo como esto final int delta = newX - getScrollX(); mScroller.startScroll (getScrollX(), 0, delta, 0, Math.abs (delta)); nuevoX es la posición actual del mouse hacia arriba. Y también puedes usar el rastreador de velocidad para verificar la velocidad de movimiento táctil. – Triode
Sí, estoy usando un VelocityTracker, pero descubrí cuál era el problema (ver respuesta a continuación). ¡Gracias! –