您的位置:首页 > 移动开发 > Android开发

Android ScrollView滚动距离和判断滚动停止状态

2017-09-04 14:06 465 查看
因为ScrollView没有像listView中的setOnScrollListener()监听,当然也就没有SCROLL_STATE_IDLE等。

解决的问题:

公司项目需要在一个列表中,类似listView,因为业务要求,这个列表是用拼凑的方法,拼凑出来的,所以外层包裹一层ScrollView。

现在公司要求,滑动到最后一条的时候,加载下一部分数据。如果使用scrollView.getScrollY()获得的是你手滑动的距离,当你松开手之后,界面会继续滑动,这个方法是获取不到新的Y值,所以,我们可以添加监听,时刻监视着ScrollView的变化。

需要先给ScrollView添加TouchListener ,在MotionEVENT.Up中,发送延迟的handler,这样就可以起到监听的作用。并且记录当前的高度lastY

在handler中,如果高度lastY和scrollView.getScrollY()是相等的,则表示,ScrollView已经停止,这时再根据你的要求判断停止之后的业务。这时的scrollView.getScrollY()就是控件滚动的距离。如果不相等,证明孩子啊滑动中,继续发handler继续记录lastY。

废话不多说,代码如下。希望对你有所帮助。

vBookDetail.setOnTouchListener(new OnTouchListener() {
private int lastY = 0;
private int touchEventId = -9983761;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
View scroller = (View) msg.obj;

if (msg.what == touchEventId) {
if (lastY == scroller.getScrollY()) {
//停止了,此处你的操作业务

} else {
handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 1);
lastY = scroller.getScrollY();
}
}
}
};

@Override
public boolean onTouch(View v, MotionEvent event) {
isScoll = false;
int eventAction = event.getAction();
int y = (int) event.getRawY();
switch (eventAction) {
case MotionEvent.ACTION_UP:

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

break;
default:
break;
}
return false;
}

});


监听ScrollView滑动到底部:

package com.example.webviewdemo;

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

public class ScrollBottomScrollView extends ScrollView {

private ScrollBottomListener scrollBottomListener;

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

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

public ScrollBottomScrollView(Context context, AttributeSet attrs,int defStyle) {
super(context, attrs, defStyle);
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt){
if(t + getHeight() >=  computeVerticalScrollRange()){
//ScrollView滑动到底部了
scrollBottomListener.scrollBottom();
}
}

public void setScrollBottomListener(ScrollBottomListener scrollBottomListener){
this.scrollBottomListener = scrollBottomListener;
}

public interface ScrollBottomListener{
public void scrollBottom();
}

}


1.监听ScrollView滑动停止:

/********************监听ScrollView滑动停止*****************************/
scrollView.setOnTouchListener(new OnTouchListener() {
private int lastY = 0;
private int touchEventId = -9983761;
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
View scroller = (View) msg.obj;
if (msg.what == touchEventId) {
if (lastY == scroller.getScrollY()) {
handleStop(scroller);
} else {
handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 5);
lastY = scroller.getScrollY();
}
}
}
};

public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
handler.sendMessageDelayed(handler.obtainMessage(touchEventId, v), 5);
}
return false;
}

private void handleStop(Object view) {
ScrollView scroller = (ScrollView) view;
scrollY = scroller.getScrollY();
}
});
/***********************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: