zoukankan      html  css  js  c++  java
  • 监听ScrollView的滑动距离和滑动状态

    原生的ScrollView并没有实现类似ListView的onScrollListener的接口,在开发中需要监听ScrollView滑动状态,比如滑动到顶部(底部),滑动的距离等等。

    在onTouchListener中可以监听到用户的点击行为,但是ScrollView在MotionEvent.Action_UP之后还会滑动一段距离,这时候就需要起一个延时的handler,这个handler实时记录当前ScrollView的滑动距离,以此来判断滑动状态

    interface onScrollListener{
    void onScrollStop();
    void onScroll(int y);
    }
    scrollView.setOnTouchListener(new OnTouchListener() { private int lastY = 0; private int touchEventId = 1001;
           private OnScrollListener listener; 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()) { //滑动停止
                    listener.onScrollStop(); } else { handler.sendMessageDelayed(handler.obtainMessage(touchEventId, scroller), 1); lastY = scroller.getScrollY();
                     listener.onScroll(lastY); } } } }; @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中尝试去重写其中的onScrollChanged方法,并将其参数通过接口暴露出来,可以实现对ScrollView滑动事件的监听。

    onScrollChanged有四个参数,官方文档对其介绍如下

    This is called in response to an internal scroll in this view (i.e., the view scrolled its own contents). This is typically as a result of scrollBy(int, int) or scrollTo(int, int) having been called.

    Parameters:
    l Current horizontal scroll origin.
    t Current vertical scroll origin.
    oldl Previous horizontal scroll origin.
    oldt Previous vertical scroll origin.

    t是当前上下滑动的位置,oldt上一次滑动的位置,通过处理t和oldt,可以判断当前的滑动状态,如滑动到顶部,滑动到底部,滑动方向等,从而实现对ScrollView滑动的监听。当然我并不建议在这个方法中进行非常耗时的处理和计算,可能影响ScrollView滑动的流畅性

  • 相关阅读:
    如何调试PHP程序
    Win10系统80端口被pid=4的System进程占用 -- 解决方法
    初用DataGrip,连接后看不到自己创建的数据库的问题
    AJAX实现跨域的三种方法
    Webstrom (或Phpstrom)使用git(oschina-码云)
    EXCEL 数字+E+数字 自动识别为指数形式的解决办法
    解决安装office2013时提示已安装相同版本的office
    将excel导入mysql(使用navicat)
    mysql按汉语拼音首字母排序
    SQL查询语句去除重复行
  • 原文地址:https://www.cnblogs.com/txlbupt/p/4371397.html
Copyright © 2011-2022 走看看