2010-06-22 12 views
5

Estoy tratando de detectar cuando un ScrollView ha terminado de desplazarse, así que puedo modificar ligeramente su posición. Antes de usar ACTION_UP para detectar cuando el usuario levantó el dedo, pero luego me di cuenta de que esto no me permitiría usar "flinging" ya que modificaría el scroll antes de que terminara.Detectando cuando scrollView se ha desplazado

¿Hay alguna manera de detectar cuándo un ScrollView ha terminado de desplazarse? ¿O detectar su estado de desplazamiento como ListView?

¿Alguna otra idea sobre cómo implementar esto?

Gracias.

+0

tratar este enlace: http://stackoverflow.com/questions/8181828/android-detect-when-scrollview-stops-scrolling – Shraddha

Respuesta

1

Lo abordaría creando una clase secundaria de ScrollView, digamos MyScrollView, y utilizando eso en lugar de ScrollView.

De esta manera puede anular los métodos de ScrollView que se invocan al desplazarse; y agregar una devolución de llamada de alguna forma en ellos (sin olvidarse de llamar al método correspondiente en super)

No puedo decirle cuál de los métodos de ScrollView se invocará cuando; Supongo que se llama a uno de ellos cada vez que ocurre un scoll, pero cuál ... tal vez simplemente scrollTo().

Supongo que sería una experiencia muy interesante y de aprendizaje para anularlas todas y simplemente iniciar sesión cuando se llamen. Es posible que desee hacerlo yo mismo, si lo hago, me aseguraré de volver con una respuesta más útil, suponiendo que nadie más lo haga durante ese tiempo.

+0

Gracias eso ayuda. ¿Hay algún lugar para encontrar la fuente de ScrollView para que pueda ver cómo están manejando el desplazamiento? Supongo que realmente no necesito cambiarlo, solo agrego algo al final que manejará mis cosas, pero aún sería útil ver las suyas. – Matt

+0

La inspección de la fuente de ScrollView también parece una buena idea. Encontré la versión donut allí: http://www.netmite.com/android/mydroid/donut/frameworks/base/core/java/android/widget/ScrollView.java - Veo que la fuente de 'scrollTo()' tiene un comentario que dice que debe llamarse cada vez que se llama a 'scrollBy()', por lo que tendería a anular 'scrollTo()' para comenzar. Buena suerte con la lectura :-) – Joubarc

+4

Simplemente anule onScrollChanged(). –

3

Implementé una solución basada en el comentario de Jourbac.

Saludos

import android.content.Context; 
import android.os.Handler; 
import android.os.Message; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.ScrollView; 

public class MyScrollView extends ScrollView { 

    private static final int WHAT = 1; 

    class MyHandler extends Handler { 
     @Override 
     public void handleMessage(Message msg) { 
      super.handleMessage(msg); 
      if(!hasMessages(WHAT)) { 
       Log.i("TestScroll", "Last msg!. Position from " 
            + msg.arg1 + " to " + msg.arg2);     
      } 
     } 
    } 

    private Handler mHandler = new MyHandler(); 

    public MyScrollView(Context context) { 
     super(context); 
    } 

    public MyScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onScrollChanged(int l, int t, int oldl, int oldt) { 
     super.onScrollChanged(l, t, oldl, oldt); 
     final Message msg = Message.obtain(); 
     msg.arg1 = oldt; 
     msg.arg2 = t; 
     msg.what = WHAT; 
     mHandler.sendMessageDelayed(msg, 500); 
    } 

} 
+0

Esto no resuelve lo que pidió el que hizo la pregunta, simplemente envía mensajes demorados en cada cambio de desplazamiento. – Warlax

+0

El mensaje de registro se imprime solo cuando el usuario ha terminado el desplazamiento en medio segundo. Resuelve la pregunta. – Fede

+0

¡Esa es en realidad una respuesta increíble, y de hecho funciona! – Anton

Cuestiones relacionadas