2010-07-24 14 views
28

ScrollView tiene un método para configurar el desplazamiento de desplazamiento xey, pero no hay ningún método para obtener el desplazamiento actual (todo lo que realmente me interesa es el desplazamiento Y, ya que ScrollView solo admite desplazamiento vertical). No veo ningún método que funcione en las superclases, y probé getTop() para la vista de contenido, que siempre es cero. ¿Me estoy perdiendo de algo?Cómo obtener el desplazamiento Y actual de un ScrollView

Respuesta

1
+4

Esos métodos están protegidos y, por lo tanto, solo son accesibles si está subclasificando ScrollView. –

+0

Gracias, Cristian, tu solución me ayudó. Ya he tenido una vista subclase desde ScrollView. Se debe calcular con un oyente setOnScrollViewListener (http://www.nicholasmelnick.com/entries/104). También una primera solución con getScrollY() funciona bien. – CoolMind

46

Llame a getScrollY() en el ScrollView. Consulte aquí para más detalles: http://developer.android.com/reference/android/view/View.html#getScrollY%28%29

+1

Quería saber si mi scrollView envolviendo un textView con contenido que aumenta periódicamente (como una vista de registro) mostraba la última línea de texto. Esto lo hizo: 'boolean lastLineVisible = scrollView.getScrollY() + scrollView.getHeight() + 100> = textView.getHeight()' –

4

Si está seguro de que debe obtener algún valor después de usar getScrollY() o getTop(), tratan de poner los método dentro de un

yourScroolView.post(new Runnable() { 
@Override 
public void run() { 
    Toast.makeText(getApplicationContext(),"Current Y is : "+getScrollY,Toast.LENGTH_SHORT).show(); 
      } 
     }); 

Ahora debería funcionar. De acuerdo con mi comprensión sobre este método, solo se ejecutará después de que se dibuje el diseño. Esa puede ser una de las razones por las cuales sigues recibiendo 0 anteriormente. Espero eso ayude.

0

Logré hacer lo siguiente. Primero, obtenga la altura y el ancho de la pantalla.

DisplayMetrics metrics = getResources().getDisplayMetrics(); 
float screenWidth = metrics.widthPixels; 
float screenHeight = metrics.heightPixels; 

a continuación para averiguar la altura del documento (del total, lo que se muestra y lo que está fuera de la pantalla)

public float getDocumentHeight(){ 
    return (computeVerticalScrollRange() * screenHeight)/computeVerticalScrollExtent(); 
} 

último para obtener el desplazamiento

public float getTopY(){ 
    return (getDocumentHeight() * computeVerticalScrollOffset())/computeVerticalScrollRange(); 
} 

Este darle la parte superior de la ventana relativa a la parte del documento que está viendo para que pueda encontrar la posición exacta de un evento por

public boolean onTouchEvent(MotionEvent event) { 
     int y = event.getY() + (int) getTopY(); 
    } 

También puede hacer algo similar para manejar el ancho

2

¿Por qué no intentar algo como esto?

targetScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { 
     @Override 
     public void onScrollChanged() { 
      int scrollX = targetScrollView.getScrollX(); 
      Log.d(TAG, "scrollX: " + scrollX); 
     } 
    }); 
Cuestiones relacionadas