网上大部分都是直接调用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() { @Override public void run() { // TODO Auto-generated method stub if(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); } }; @Override public 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进去,不然会出错。
相关推荐
Android,自定义HorizontalScrollView,实现过度滑动时回弹效果。横向的ScrollView,过度滑动时,手指抬起即出现回弹效果,这是一种边界反馈。
Android HorizontalScrollView实现横向Gallery
Android重写HorizontalScrollView仿ViewPager效果
该资源实现了上下控件联动的效果,特别是可以跳转到另一个Activity
Android ViewPager与仿Gallery的HorizontalScrollView互相滑动监听
Android,自定义ScrollView,实现分页效果。利用此资源,可以灵活改变页宽、触发翻页的条件等。 本例中采用scrollTo方法+Scroller类配合实现平滑过度效果。
根据网上大牛的一些代码,自己试着写出来的一个效果,新人可以学习学习,因为我查资料的时候发现这个无限滚动的HorizontalScrollView资料很少。
android 横向scrollview滚动
主要为大家详细介绍了Android HorizontalScrollView左右滑动效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
android HorizontalScrollView +listview blog 地址: http://blog.csdn.net/aaawqqq/article/details/25082417
主要为大家详细介绍了Android使用HorizontalScrollView实现水平滚动,并点击有相应的反应效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
android自定义HorizontalScrollView。 滑动停止后,其中的子元素始终保持左边对齐的状态。防止出现显示不全的情况
实现左滑删除最简单的方式,通过HorizontalScrollView 实现的一个最简单的左滑出删除按钮的demo
以HorizontalScrollView与Viewpager实现分页滑动,类似淘宝分页滑动效果,其中头部局可以自定义
android 中的HorizontalScrollView 水平滚动实现方法。几种滚动方式的介绍,如何在代码中使用。
使用horizontalScrollview使图片左右滑动
该资源实现了HorizontalScrollView嵌套GridView实现单行滚动效果。选中GridView的item,该item下面的ListView跟着变化,并处理了他们之间的焦点转换问题
HorizontalScrollView实现Gallery,通过继承LinearLayout,往布局里添加数据,再外围套个左右滚动视频
今天无聊想实现一下网易新闻中栏目滑动的效果,想到了用HorizontalScrollView结合GridView来实现基础的功能: