最近在工作中,用到的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(); } }
/** *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("滑动到顶部"); } }