`

android HorizontalScrollView实现滚动监听

阅读更多

网上大部分都是直接调用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进去,不然会出错。

0
0
分享到:
评论

相关推荐

    无限滚动的HorizontalScrollView

    在这个"无限滚动的HorizontalScrollView"项目中,开发者尝试实现了一个特殊的滚动效果,使得用户在水平滑动时能体验到无缝、连续的滚动感,就像内容是无限的一样。这在展示大量横向排列的数据或图片时非常有用,比如...

    Android,自定义HorizontalScrollView,实现过度滑动时回弹效果

    总结起来,实现一个自定义的HorizontalScrollView以实现过度滑动时的回弹效果,需要对Android触摸事件处理机制、滚动动画及物理效果有深入理解。通过对`onTouchEvent()`、`computeScroll()`等相关方法的重写和`...

    Android,自定义HorizontalScrollView,实现分页效果

    总的来说,自定义HorizontalScrollView实现分页效果涉及到对Android的触摸事件处理、视图滚动机制以及动画原理的理解。通过以上步骤,开发者能够创建出具有平滑过渡和分页功能的滚动视图,提升用户体验。在实际项目...

    Android HorizontalScrollView实现横向Gallery

    为了模拟Gallery的焦点和选中效果,我们可以监听HorizontalScrollView的滚动事件,当用户滚动到某个子视图时,更新其他子视图的状态,如改变背景色或添加边框,以突出当前选中项。 5. **优化性能**: 当...

    Android,自定义HorizontalScrollView,更简单地实现分页效果

    在标准的Android SDK中,HorizontalScrollView是一个内置的控件,用于水平方向上的滚动,但它并不直接支持这样的分页功能。为了实现这种效果,开发者通常需要自定义HorizontalScrollView。 本示例中,我们通过...

    android HorizontalScrollView和ViewPager联动效果

    在Android开发中,HorizontalScrollView和ViewPager是两种常用的布局组件,它们各自有特定的功能,并且在某些场景下可以结合使用以实现独特的交互效果。本资源主要探讨了如何将这两个组件联动,尤其是在上下控件间...

    Android HorizontalScrollView

    HorizontalScrollView是Android开发中一种特殊的视图容器,用于在水平方向上展示一组可滚动的子视图。在Android布局设计中,我们常常遇到需要在横向展示大量内容的情况,比如图片轮播、选项卡或者水平菜单等,这时...

    Android仿ViewPager(重写HorizontalScrollView)

    我们需要在重写的HorizontalScrollView中实现类似的功能,如`onPageScrolled`、`onPageSelected`和`onPageScrollStateChanged`等回调方法,以便在页面滚动时动态加载或移除子视图。 2. **手势识别与处理**:...

    Android 自定义 HorizontalScrollView 打造超强 Gallery效果 完整实例源码

    总的来说,这个实例提供了创建自定义HorizontalScrollView并实现类似Gallery效果的方法,这对于那些希望在Android应用中实现独特滚动体验的开发者来说是非常有价值的。通过深入研究源码,开发者可以学习到如何扩展...

    horizontalScrollview实现图片的左右滑动

    HorizontalScrollView是Android开发中一种特殊的视图容器,它允许用户水平滚动其子视图,而普通的ScrollView只能垂直滚动。在本教程中,我们将深入探讨如何使用HorizontalScrollView来实现图片的左右滑动效果。 ...

    ViewPager和Fragment结合,利用(HorizontalScrollView)实现指示器与ViewPager同时滑动的动态效果

    HorizontalScrollView是Android提供的一个水平滚动的布局,它可以容纳一个或多个子视图,并允许用户在水平方向上滑动查看这些子视图。在这个场景下,HorizontalScrollView将作为指示器的容器,显示当前选中的页面。 ...

    Android ViewPager与仿Gallery的HorizontalScrollView互相滑动监听

    综上所述,实现`Android ViewPager`与仿`Gallery`的`HorizontalScrollView`互相滑动监听涉及多个层次的技术,包括自定义适配器、滑动事件监听、手势识别等。这需要开发者具备扎实的Android基础知识,对组件工作原理...

    导航栏联动效果( HorizontalScrollView+ViewPager)

    在Android开发中,创建动态、交互丰富的用户界面是至关重要的,而"导航栏联动效果(HorizontalScrollView+ViewPager)"正是实现这一目标的一种有效方法。这种技术通常用于电商平台、新闻应用等,提供一种平滑的横向...

    HorizontalScrollView实现网页新闻栏目滑动效果

    为了实现滑动监听和交互,你可以为HorizontalScrollView添加OnScrollChangeListener,监听滑动事件,以便在用户滑动到栏目末尾时加载更多内容。同时,考虑使用SmoothScrollTo方法平滑滚动到特定位置,提供更好的用户...

    ViewPager头用HorizontalScrollView自己实现

    标题 "ViewPager头用HorizontalScrollView自己实现" 涉及到的是Android开发中的一个常见需求,即自定义ViewPager的头部视图。ViewPager是Android SDK中一个强大的控件,用于展示多个可以横向滑动的页面,常用于实现...

    Android左右滑动显示图片HorizontalScrollView

    HorizontalScrollView在Android开发中是一种常见的布局控件,用于展示可以水平滚动的内容,通常用来实现图片轮播、选项卡切换等效果。在这个demo中,开发者通过学习和实践,创建了一个简单的HorizontalScrollView...

    HorizontalScrollView嵌套GridView实现水平滚动

    本教程将详细讲解如何将HorizontalScrollView与GridView结合,实现一个单行水平滚动的效果,以及在选中GridView中的item时,与之关联的ListView动态变化的技巧。 首先,我们了解HorizontalScrollView的基本用法。...

    HorizontalScrollView实现Gallery

    为了实现左右滚动的效果,我们需要在`MyHorizontalGallery`中添加手势检测或滑动监听器。可以使用Android提供的`GestureDetector`或直接处理MotionEvent,当检测到用户向左或向右滑动时,触发视图的滚动。滚动可以...

Global site tag (gtag.js) - Google Analytics