2012-04-12 17 views
5

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); 
     } 
    } 
} 
+0

¿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

+0

¿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

+0

Sí, estoy usando un VelocityTracker, pero descubrí cuál era el problema (ver respuesta a continuación). ¡Gracias! –

Respuesta

2

bien lo tengo. De hecho, tuve que extender mi duración (sin embargo, la documentación es un poco engañosa: no es el valor que se agrega a la duración calculada actual, sino la nueva duración real).

Después de leer un poco más de documentación me he dado cuenta de que la velocidad necesaria es de hecho píxeles por segundo y de hecho he definido el VelocityTracker para usar esta unidad.

Así que esta es la línea que falta:

scroller.extendDuration ((int) (Math.abs (offsetX)/(float) Math.max (1000, Math.abs (initialVelocity)) * 1000));

Cuestiones relacionadas