ScrollView是我们经常使用的一个UI控件,也许你在使用ScrollView的过程中会发现,当你想监听ScrollView滑动的距离时却没有合适的监听器!当然在API 23中有setOnScrollChangeListener(View.OnScrollChangeListener l)
可以使用,但是并不兼容低版本的API。那怎么办呢?只好重写ScrollView来实现对滑动距离的监听了。
话不多说,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| public class MyScrollView extends ScrollView {
private OnScrollListener listener;
public void setOnScrollListener(OnScrollListener listener) { this.listener = listener; }
public MyScrollView(Context context) { super(context); }
public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); }
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
public interface OnScrollListener{
void onScroll(int scrollY); }
@Override public void computeScroll() { super.computeScroll(); if(listener!=null){ listener.onScroll(getScrollY()); } } }
|
上面重写的MyScrollView是在computeScroll()
实现监听,因为ScrollView内部是通过Scroller来实现的,当滑动的时候会去调用computeScroll()
方法,从而达到监听的效果。
当然还有另一种方法,就是在onScrollChanged(int l, int t, int oldl, int oldt)
去监听,最后的效果是一样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class MyScrollView extends ScrollView {
private OnScrollListener listener;
public void setOnScrollListener(OnScrollListener listener) { this.listener = listener; }
public MyScrollView(Context context) { super(context); }
public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); }
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
public interface OnScrollListener{ void onScroll(int scrollY); }
@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if(listener != null){ listener.onScroll(t); } } }
|