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

因为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();
    }
});
/***********************************************************/

 

posted @ 2017-09-04 14:06  星辰之力  阅读(1198)  评论(0编辑  收藏  举报