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


    今天很高兴,自己解决了判断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。

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

    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
    41
    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;
                }
     
     
            });

     

  • 相关阅读:
    6个Windows Live™ Messenger beta的邀请
    终于可以抛弃Adobe Acrobat了
    如何在VxWorks下为TAU G2的程序设置断点
    基于C++的模板引擎
    思维导图确实是个好东西
    换了一个免费的PDF生成工具
    V.42 bis的源程序
    统计源程序的工具
    Doxygen的输出中文乱码
    如何编写Google CTemplate的Modifier
  • 原文地址:https://www.cnblogs.com/ZhuRenWang/p/5006414.html
Copyright © 2020-2023  润新知