Scrollview 系列之监测滑动

       最近在工作中,用到的scrollview等滑动的比较多,scrollview监听到达底部还是顶部,监测滑动距离啊,无一例外都会去重写scrollview,scrollview并没有提供给我们一个直接的方法,我们需要去实现一个接口,将方法暴露出来,然后我们通过接口回调就可以实现监控滑动了,整体来说也是非常简单的。

判断到达底部我们只要实现在onScrollChanged方法里面监听一哈就可以

@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		if(t + getHeight() >= contentView.getHeight()  && onScrollChangeListener != null){
			onScrollChangeListener.onScrollBottomListener();
		}
	}


到达顶部也是一样的

@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		if(t == 0 || t + getHeight() > contentView.getHeight()&& onScrollChangeListener != null){
			onScrollChangeListener.onScrollTopListener();
		}
	}


对上面的代码做一个解释,scrollview只有一个子view,所以我们只需要判断滑动的距离加上scrollview显示的高度,即可以显示的高度,如果滑动的距离加上显示的高度大于等于子view的高度,即滑动到了底部,如果初始距离t=0,那么肯定是在顶部,还有一种情况是滑动的距离加上显示的高度大于子view的高度,即子view的高度本身就小于scrollview的高度,就认为即是在顶部,也在底部。我们还可以在其中写个方法将此接口onScrollchange暴露出去,通过这个接口可以监听scrollview滑动的距离,判断向上滑动还是向下滑动啊,代码如下
/**
	 *l当前水平滚动的开始位置
	 *t当前的垂直滚动的开始位置
	 *oldl上一次水平滚动的位置。
	 *oldt上一次垂直滚动的位置。
	 **/
	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		if(onScrollChangeListener != null){
			onScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
		}
	}

下面给出完整的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ScrollView;

public class MyScrollView extends ScrollView{
	public OnScrollChangeListener onScrollChangeListener;

	public View contentView;

	public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener){
		this.onScrollChangeListener = onScrollChangeListener;
	}

	public MyScrollView(Context context) {
		super(context);  
	}

	public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);  
	}

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);  
	}

	@Override
	protected void onFinishInflate() {
		// TODO Auto-generated method stub
		if(getChildCount() > 0){
			contentView = getChildAt(0);
		}
	}
	
	public interface OnScrollChangeListener{
		void onScrollChange(MyScrollView view,int x,int y,int oldx,int oldy);
		void onScrollBottomListener();
		void onScrollTopListener();
	}
	/**
	 *l当前水平滚动的开始位置
	 *t当前的垂直滚动的开始位置
	 *oldl上一次水平滚动的位置。
	 *oldt上一次垂直滚动的位置。
	 **/
	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		super.onScrollChanged(l, t, oldl, oldt);
		if(onScrollChangeListener != null){
			onScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
		}
		if(t + getHeight() >= contentView.getHeight() && onScrollChangeListener != null){
			onScrollChangeListener.onScrollBottomListener();
		}
		if(t == 0 || t + getHeight() > contentView.getHeight() && onScrollChangeListener != null){
			onScrollChangeListener.onScrollTopListener();
		}
	}

	
}
我们在自己的view里面调用相关的接口既可以监听,实现接口并注册,然后即可在里面实现相关的逻辑操作,判断到达底部网上也有一种
//	scrollX     新的X滚动像素值
//	scrollY     新的Y滚动像素值
//	clampedX    当scrollX被over-scroll的边界限制时,值为true
//	clampedY    当scrollY被over-scroll的边界限制时,值为true
	@Override
	protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,
			boolean clampedY) {
		// TODO Auto-generated method stub
		super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
	}
但是发现并不能实现,每次到达底部或者顶部都会返回true,查了API发现是到达边界限制,还是第一种方法好用点,调用也一并给出吧

public class OnTouchListener extends Activity implements OnScrollChangeListener{
	private TextView tv;
	private MyScrollView scrollView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listener_event_layout);
		scrollView = (MyScrollView) findViewById(R.id.myScrollView);
		tv = (TextView) findViewById(R.id.tv);
		scrollView.setOnScrollChangeListener(this);
		new Thread(new Runnable() {
			@Override
			public void run() {
				Map<String, String> params = new HashMap<String, String>();
				final String result = HttpUtil.HttpsdoPost("http://www.baidu.com", params);
				runOnUiThread(new Runnable() {
					public void run() {
						tv.setText(result);
					}
				});
			}
		}).start();
	}

	@Override
	public void onScrollChange(MyScrollView view, int x, int y, int oldx,
			int oldy) {
		if(y - oldy > 0){
			showToast("向下滑动");
		}else if(oldy - y > 0){
			showToast("向上滑动");
		}
	}

	private void showToast(String message){
		Toast.makeText(OnTouchListener.this, message, Toast.LENGTH_LONG).show();
	}


	@Override
	public void onScrollBottomListener() {
		// TODO Auto-generated method stub
		showToast("滑动到底部");
	}


	@Override
	public void onScrollTopListener() {
		// TODO Auto-generated method stub
		showToast("滑动到顶部");
	}

}

总的来说还是非常简单的,以上就是实现的源码了,欢迎提问



你可能感兴趣的:(滑动距离监听)