我的解决方案是Lin Yu Cheng出色解决方案的变体,并且还可以检测滚动开始和停止的时间。 
步骤1.定义HorizontalScrollView和OnScrollChangedListener:
CustomHorizontalScrollView scrollView = (CustomHorizontalScrollView) findViewById(R.id.horizontalScrollView);
horizontalScrollListener = new CustomHorizontalScrollView.OnScrollChangedListener() {
    @Override
    public void onScrollStart() {
        
    }
    @Override
    public void onScrollEnd() {
         
    }
};
scrollView.setOnScrollChangedListener(horizontalScrollListener);
步骤2.添加CustomHorizontalScrollView类:
public class CustomHorizontalScrollView extends HorizontalScrollView {
    public interface OnScrollChangedListener {
        
        void onScrollStart();
        void onScrollEnd();
    }
    private long lastScrollUpdate = -1;
    private int scrollTaskInterval = 100;
    private Runnable mScrollingRunnable;
    public OnScrollChangedListener mOnScrollListener;
    public CustomHorizontalScrollView(Context context) {
        this(context, null, 0);
        init(context);
    }
    public CustomHorizontalScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        init(context);
    }
    public CustomHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }
    private void init(Context context) {
        
        mScrollingRunnable = new Runnable() {
            public void run() {
                if ((System.currentTimeMillis() - lastScrollUpdate) > scrollTaskInterval) {
                    
                    lastScrollUpdate = -1;
                    
                    mOnScrollListener.onScrollEnd();
                } else {
                    
                    postDelayed(this, scrollTaskInterval);
                }
            }
        };
    }
    public void setOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener) {
        this.mOnScrollListener = onScrollChangedListener;
    }
    public void setScrollTaskInterval(int scrollTaskInterval) {
        this.scrollTaskInterval = scrollTaskInterval;
    }
    
    
    
    
    
    
    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
        if (mOnScrollListener != null) {
            if (lastScrollUpdate == -1) {
                
                mOnScrollListener.onScrollStart();
                postDelayed(mScrollingRunnable, scrollTaskInterval);
            }
            lastScrollUpdate = System.currentTimeMillis();
        }
    }
}