Могу ли я использовать onScrollListener для ScrollView?

Я использую HorizontalScrollView в макете, и мне нужно определить, что пользователь достиг начальной и конечной точки прокрутки.

Для ListView я попробовал onScrollListener и можно найти начальную и конечную точку прокрутки.

Я попытался сделать то же самое в своем Scrollview но это кажется невозможным. Есть ли еще какие-то другие способы достижения того, что мне нужно.

Заранее спасибо.

Каждый экземпляр View вызывает getViewTreeObserver() . Теперь, удерживая экземпляр ViewTreeObserver , вы можете добавить к нему OnScrollChangedListener() используя метод addOnScrollChangedListener() .

Здесь вы можете увидеть дополнительную информацию об этом классе.

Это позволяет вам знать о каждом прокручиваемом событии, но без координат. Вы можете получить их, используя getScrollY() или getScrollX() изнутри слушателя.

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

Это может быть очень полезно. Используйте NestedScrollView вместо ScrollView. Библиотека поддержки 23.1 представила OnScrollChangeListener для NestedScrollView. Поэтому вы можете сделать что-то подобное.

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

Вот производный HorizontalScrollView, который я написал для обработки уведомлений о прокрутке и прокрутке. Он правильно обрабатывает, когда пользователь остановил активную прокрутку и когда он полностью замедляется после того, как пользователь отпустит:

 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; } } 
Intereting Posts