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