android android-scrollview onscrollchanged

Android scrollview onScrollChanged



android-scrollview (10)

A partir de API 23 Android M, puede utilizar OnScrollChangeListener.

scrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { //work with parameters } });

Tengo un contenido fijo en mi vista de texto dentro de una vista de desplazamiento. Cuando el usuario se desplaza a una determinada posición, me gustaría comenzar una actividad o activar un Toast .

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/scroller"> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:id="@+id/story" android:layout_height="wrap_content" android:text="@string/lorem" android:gravity="fill" /> </LinearLayout> </ScrollView>

Mi problema está en implementar el método protegido onScrollChanged para averiguar la posición de la vista de desplazamiento.

He encontrado this respuesta, ¿existe una solución más fácil para esto en lugar de declarar una interfaz, sobrepasar el scrollview, etc., como se ve en el enlace que publiqué?


En realidad, hay una manera de saber hasta qué punto se ha desplazado el usuario. El método getScrollY () de ScrollView te dice eso.


Esta pregunta es bastante antigua, pero en caso de que alguien se acerque (como yo):

A partir de la API 23 , la View de Android tiene un OnScrollChangeListener y el OnScrollChangeListener correspondiente .

El NestedScrollView de la biblioteca de soporte también admite la configuración de un detector de desplazamiento incluso antes de ese nivel de API. Por lo que sé, NestedScrollView puede utilizarse como un reemplazo para el ScrollView normal sin ningún problema.


Extendí mi scrollView. Este enlace puede ayudar.

class MyScroll extends ScrollView { boolean onTop=true; @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { //Log.d(TAG, "scroll changed: " + this.getTop() + " "+t); if(t <= 0){ onTop = true; //Log.d(TAG, "scroll top: " + t); super.onScrollChanged(l, t, oldl, oldt); return; // reaches the top end } onTop = false; View view = (View) getChildAt(getChildCount()-1); int diff = (view.getBottom()-(getHeight()+getScrollY()+view.getTop()));// Calculate the scrolldiff if( diff <= 0 ){ // if diff is zero, then the bottom has been reached } super.onScrollChanged(l, t, oldl, oldt); } }


Hay un componente listo para usar , que ayuda a escuchar eventos de desplazamiento de vistas arbitrarias en Android. Internamente, este componente agrega el servicio de escucha de eventos de desplazamiento ViewTreeObserver en dispositivos con la antigua API de Android (similar a la propuesta en la respuesta de Shubhadeep Chaudhuri) y el programa de escucha de eventos de vista de desplazamiento en dispositivos con la nueva API de Android (nivel API 23+).


Hay una forma mucho más fácil que subclasificar ScrollView . El objeto ViewTreeObserver de ScrollView se puede usar para escuchar los desplazamientos.

Dado que el objeto ViewTreeObserver puede cambiar durante la vida útil de ScrollView , debemos registrar un OnTouchListener en ScrollView para obtener su ViewTreeObserver en el momento del desplazamiento.

final ViewTreeObserver.OnScrollChangedListener onScrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { //do stuff here } }; final ScrollView scrollView = (ScrollView) findViewById(R.id.scroller); scrollView.setOnTouchListener(new View.OnTouchListener() { private ViewTreeObserver observer; @Override public boolean onTouch(View v, MotionEvent event) { if (observer == null) { observer = scrollView.getViewTreeObserver(); observer.addOnScrollChangedListener(onScrollChangedListener); } else if (!observer.isAlive()) { observer.removeOnScrollChangedListener(onScrollChangedListener); observer = scrollView.getViewTreeObserver(); observer.addOnScrollChangedListener(onScrollChangedListener); } return false; } });


NestedScrollView es como android.widget.ScrollView, pero admite que actúe como padre e hijo de desplazamiento anidados en versiones nuevas y antiguas de Android.

1º - Use el enlace NestedScrollView en lugar de ScrollView

2º: establezca la función de escucha de desplazamiento, de esta manera, para detectar el movimiento del eje Y para un headerView por ejemplo

nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { Log.d(TAG, "onScrollChangeForY - scrollY: " + scrollY + " oldScrollY: " + oldScrollY); int MOVE = -1, SCROLL_UP = 0, SCROLL_DOWN = 1; float initialPositionY = headerView.getY(); MOVE = scrollY > oldScrollY ? SCROLL_UP : SCROLL_DOWN; if (MOVE == SCROLL_UP) { int incrementY = scrollY - oldScrollY; headerView.setY(initialPositionY - incrementY); } else { int incrementY = oldScrollY - scrollY; headerView.setY(initialPositionY + incrementY); } } });


No.

ScrollView no proporciona un servicio de escucha para los eventos de desplazamiento o incluso una forma de comprobar hasta qué punto ha desplazado el usuario, por lo que debe hacer lo que sugiere el enlace.


Simplemente use NestedScroll y NestedScroll.setOnScrollChangeListener() .


puede utilizar este disparador para mostrar Toast o Iniciar actividad

scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() { @Override public void onScrollChanged() { // do something when Scroll } });