¿Puedo tener onScrollListener para un ScrollView?
Estoy usando un HorizontalScrollView
en un diseño y necesito identificar al usuario que ha llegado al punto inicial y final del rollo.
Para ListView
he probado un onScrollListener
y es posible encontrar el punto inicial y final de desplazamiento.
- Diseño relativo en ScrollView
- Evitar que una vista anidada en un ScrollView se desplace fuera de la pantalla
- Android RelativeLayout alinear preocupación
- Android, LinearLayout no se desplaza
- Cómo obtener el desplazamiento de una vista dentro de un ScrollView?
Intenté hacer lo mismo en mi Scrollview
pero parece que no es posible. ¿Hay otras maneras posibles de lograr lo que necesito.
Gracias por adelantado.
- El teclado suave de Android oculta el botón
- RelativeLayout dentro de scrollview no se desplaza
- Implementar zoom en scrollView android
- Cómo configurar el color de un borde de desvanecimiento Android ScrollView?
- ScrollView> LinearLayout> PreferenceFragment es altura cero
- ScrollView no se desplaza si el teclado virtual está visible
- Cómo hacer encabezados de sección pegajosa (como iOS) en Android?
- Scrollview está detrás de ActionBar Android
Cada instancia de View llama a getViewTreeObserver()
. Ahora, al mantener una instancia de ViewTreeObserver
, puede agregar un OnScrollChangedListener()
a ella mediante el método addOnScrollChangedListener()
.
Puede ver más información sobre esta clase aquí .
Le permite estar al tanto de cada evento de desplazamiento, pero sin las coordenadas. Usted puede conseguirlos usando getScrollY()
o getScrollX()
de dentro del oyente sin embargo.
scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() { @Override public void onScrollChanged() { int scrollY = rootScrollView.getScrollY(); // For ScrollView int scrollX = rootScrollView.getScrollX(); // For HorizontalScrollView // DO SOMETHING WITH THE SCROLL COORDINATES } });
Esto podría ser muy útil. Utilice NestedScrollView en lugar de ScrollView. La Biblioteca de soporte 23.1 introdujo un OnScrollChangeListener en NestedScrollView. Así que puedes hacer algo como esto.
myScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { @Override public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { Log.d("ScrollView","scrollX_"+scrollX+"_scrollY_"+scrollY+"_oldScrollX_"+oldScrollX+"_oldScrollY_"+oldScrollY); //Do something } });
Aquí está un HorizontalScrollView derivado que escribí para manejar las notificaciones sobre desplazamiento y desplazamiento final. Se maneja correctamente cuando un usuario ha dejado de activar el desplazamiento y cuando se desacelera completamente después de que un usuario permite ir:
public class ObservableHorizontalScrollView extends HorizontalScrollView { public interface OnScrollListener { public void onScrollChanged(ObservableHorizontalScrollView scrollView, int x, int y, int oldX, int oldY); public void onEndScroll(ObservableHorizontalScrollView scrollView); } private boolean mIsScrolling; private boolean mIsTouching; private Runnable mScrollingRunnable; private OnScrollListener mOnScrollListener; public ObservableHorizontalScrollView(Context context) { this(context, null, 0); } public ObservableHorizontalScrollView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ObservableHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); if (action == MotionEvent.ACTION_MOVE) { mIsTouching = true; mIsScrolling = true; } else if (action == MotionEvent.ACTION_UP) { if (mIsTouching && !mIsScrolling) { if (mOnScrollListener != null) { mOnScrollListener.onEndScroll(this); } } mIsTouching = false; } return super.onTouchEvent(ev); } @Override protected void onScrollChanged(int x, int y, int oldX, int oldY) { super.onScrollChanged(x, y, oldX, oldY); if (Math.abs(oldX - x) > 0) { if (mScrollingRunnable != null) { removeCallbacks(mScrollingRunnable); } mScrollingRunnable = new Runnable() { public void run() { if (mIsScrolling && !mIsTouching) { if (mOnScrollListener != null) { mOnScrollListener.onEndScroll(ObservableHorizontalScrollView.this); } } mIsScrolling = false; mScrollingRunnable = null; } }; postDelayed(mScrollingRunnable, 200); } if (mOnScrollListener != null) { mOnScrollListener.onScrollChanged(this, x, y, oldX, oldY); } } public OnScrollListener getOnScrollListener() { return mOnScrollListener; } public void setOnScrollListener(OnScrollListener mOnEndScrollListener) { this.mOnScrollListener = mOnEndScrollListener; } }
- Cómo comprobar el texto de edittext es la dirección de correo electrónico o no?
- Color logcat en el estudio android por colorpid