Đây là một nguồn gốc HorizontalScrollView tôi đã viết để xử lý thông báo về cuộn và cuộn kết thúc. Nó đúng cách xử lý khi người dùng đã ngừng tích cực di chuyển và khi nó hoàn toàn decelerates sau khi người dùng cho phép đi:
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ó thể. Xem câu trả lời của người dùng2695685. Trong ngắn hạn sau trong 'onStart' sẽ làm các trick:' hsv.getViewTreeObserver(). AddOnScrollChangedListener (mới ViewTreeObserver.OnScrollChangedListener() {@Override public void onScrollChanged() {Log.i (TAG, "cuộn:" + hsv. getScrollX());}}); 'trong onStart() trong đó' hsv' là một tác phẩm 'HorizontalScrollView'. – JohnnyLambada
chấp nhận bất kỳ câu trả lời hữu ích nào .. nếu người khác đăng câu trả lời của riêng bạn .. –
Tại sao phát hiện sự kiện cuộn bằng ScrollView rất khó trong Android? Đây là hạt imo. – worked