网上大部分都是直接调用onScrollChanged(int x, int y, int oldx, int oldy) 这个方法的,实际上只是将这个方法的protected改为public而已,本质上上还是没有什么多大的帮助,不多少,直接上代码

import android.content.Context;import android.os.Handler;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.HorizontalScrollView;public class ScrollListenerHorizontalScrollView extends HorizontalScrollView{public ScrollListenerHorizontalScrollView(Context context,AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public ScrollListenerHorizontalScrollView(Context context,AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public ScrollListenerHorizontalScrollView(Context context) {super(context);// TODO Auto-generated constructor stub}public interface ScrollViewListener {        void onScrollChanged(ScrollType scrollType);    }  private Handler mHandler;private ScrollViewListener scrollViewListener;/** * 滚动状态   IDLE 滚动停止  TOUCH_SCROLL 手指拖动滚动         FLING滚动 * @version XHorizontalScrollViewgallery * @author DZC * @Time  2014-12-7 上午11:06:52 * * */    enum ScrollType{IDLE,TOUCH_SCROLL,FLING};        /**     * 记录当前滚动的距离     */    private int currentX = -9999999;    /**     * 当前滚动状态     */    private ScrollType scrollType = ScrollType.IDLE;    /**     * 滚动监听间隔     */    private int scrollDealy = 50;    /**     * 滚动监听runnable     */    private Runnable scrollRunnable = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubif(getScrollX()==currentX){//滚动停止  取消监听线程Log.d("", "停止滚动");scrollType = ScrollType.IDLE;if(scrollViewListener!=null){scrollViewListener.onScrollChanged(scrollType);}mHandler.removeCallbacks(this);return;}else{//手指离开屏幕    view还在滚动的时候Log.d("", "Fling。。。。。");scrollType = ScrollType.FLING;if(scrollViewListener!=null){scrollViewListener.onScrollChanged(scrollType);}}currentX = getScrollX();mHandler.postDelayed(this, scrollDealy);}};@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_MOVE:this.scrollType = ScrollType.TOUCH_SCROLL;scrollViewListener.onScrollChanged(scrollType);//手指在上面移动的时候   取消滚动监听线程mHandler.removeCallbacks(scrollRunnable);break;case MotionEvent.ACTION_UP://手指移动的时候mHandler.post(scrollRunnable);break;}return super.onTouchEvent(ev);}/** * 必须先调用这个方法设置Handler  不然会出错 *  2014-12-7 下午3:55:39  * @author DZC * @return void * @param handler   * @TODO */public void setHandler(Handler handler){this.mHandler = handler;}/** * 设置滚动监听 *  2014-12-7 下午3:59:51  * @author DZC * @return void * @param listener   * @TODO */public void setOnScrollStateChangedListener(ScrollViewListener listener){this.scrollViewListener = listener;}}

代码注释已经写得我认为很详细了,不懂的可以留言,说下思路,就是开启一个线程,每个一定的时间间隔去判断当前的scrollX是否有改变,要是有改变就说明还在滚动,要是没有改变就说明已经停止滚动了。

要注意的一点就是使用的时候必须调用setHandler(Handler handler)传一个在activity创建的Handler进去,不然会出错。

更多相关文章

  1. Android(安卓)layer type与WebView白屏
  2. Android: 如何利用Handler、Thread更新视图
  3. HandlerThread的使用
  4. [Android] AsyncTask使用实例---加载网络图片
  5. Android基于XMPP Smack Openfire开发IM【三】客户端接收服务器发
  6. 零打碎敲学Android(一)—用什么来替代Graphics
  7. Android(安卓)利用url获取Bitmap图片
  8. [置顶] Android(安卓)自定义UI文章汇总
  9. Android开发面试经——4.常见Android进阶笔试题(更新中...)

随机推荐

  1. android重要包的描述
  2. android动态创建控件
  3. Android近期任务列表 Recent Applicatoin
  4. Android屏幕适配攻略
  5. Android(安卓)-- Looper.prepare()和Loop
  6. Android项目--团购类客户端
  7. 生命週期
  8. 【安卓学习笔记】Android(安卓)Studio第9
  9. Andriod自动化测试原理基础
  10. Linux 使用 Nexus3.x 为 Android(安卓)搭