• 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();
        }
    });
    /***********************************************************/
  • 相关阅读:
    3.29Java流程控制语句之循环结构
    3.27Java自动类型转化
    3.27Java流程控制语句
    3.27字符串连接符
    计算机系统概论
    《算法导论》第12章 二叉查找树 (2)查找、插入与删除
    《算法导论》第14章 数据结构的扩张 (1)动态顺序统计
    《算法导论》第12章 二叉查找树 (3)基数树
    关于算法学习的总结和感悟(原创)
    《Windows游戏编程大师技巧》二、Windows编程模型
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7473353.html
Copyright © 2020-2023  润新知