您的位置:首页 > 其它

Scrollview 滑动距离

2015-12-21 17:52 363 查看
public class ObservableScrollView extends ScrollView {

private ScrollViewListener scrollViewListener = null;

public ObservableScrollView(Context context) {

super(context);

}

public ObservableScrollView(Context context, AttributeSet attrs,

int defStyle) {

super(context, attrs, defStyle);

}

public ObservableScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public void setScrollViewListener(ScrollViewListener scrollViewListener) {

this.scrollViewListener = scrollViewListener;

}

@Override

protected void onScrollChanged(int x, int y, int oldx, int oldy) {

super.onScrollChanged(x, y, oldx, oldy);

if (scrollViewListener != null) {

scrollViewListener.onScrollParms(this, x, y, oldx, oldy);

}

}

public interface ScrollViewListener {

void onScrollParms(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);

void onScrollY(int scrollY);

}

/**

* 主要是用在用户手指离开MyScrollView,MyScrollView还在继续滑动,我们用来保存Y的距离,然后做比较

*/

private int lastScrollY;

// 用于用户手指离开MyScrollView的时候获取MyScrollView滚动的Y距离,然后回调给onScroll方法

private Handler handler = new Handler() {

public void handleMessage(android.os.Message msg) {

int scrollY = ObservableScrollView.this.getScrollY();

//此时的距离和记录下的距离不相等,在隔5毫秒给handler发送消息

if (lastScrollY != scrollY) {

lastScrollY = scrollY;

handler.sendMessageDelayed(handler.obtainMessage(), 5);

}

if (scrollViewListener != null) {

scrollViewListener.onScrollY(scrollY);

}

}

;

};

/**

* 重写onTouchEvent, 当用户的手在MyScrollView上面的时候,

* 直接将MyScrollView滑动的Y方向距离回调给onScroll方法中,当用户抬起手的时候,

* MyScrollView可能还在滑动,所以当用户抬起手我们隔5毫秒给handler发送消息,在handler处理

* MyScrollView滑动的距离

*/

@Override

public boolean onTouchEvent(MotionEvent ev) {

if (scrollViewListener != null) {

scrollViewListener.onScrollY(lastScrollY = this.getScrollY());

}

switch (ev.getAction()) {

case MotionEvent.ACTION_UP:

handler.sendMessageDelayed(handler.obtainMessage(), 20);

break;

}

return super.onTouchEvent(ev);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: