zoukankan      html  css  js  c++  java
  • Android PullTorefreshScrollview回到顶部

    列表滑动下面显示按钮,点击按钮回到顶部的功能,一般scrollview会有滑动监听的事件,通过setOnScrollChangeListener()滑动监听滑动的距离来判断是否显示按钮就好了,但是PullTorefreshScrollview通过getRefreshableView()方法得到scrollview后没有setOnScrollChangeListener()滑动监听事件,没办法只能通过setOnTouchListener()事件来判断。

    onTouchListener方法,只能监听到手势,即何时按下、移动和弹起。当快速滑动手指弹起后,scrollview还在滚动的,什么时候去拿到它的scrollY值呢? 
    在自定义imageview里面定义线程,扫描当前scrollY和上一次保存的对比,不一样即说明仍在滚动,一样即表明scrollview滚动停止了。 
    什么时候开启线程呢?在onTouch回调中down、move或者up时调用。 
    试想下: 
    如果在down中调用时,用户只在scrollview上点击或短距离滑动,imageview里面要不停地开启线程?浪费资源。 
    如果在up中调用时,当用户按着屏幕一口气滑过临界值,还不松手呢?还不显示imageview吗?也行,个人觉得不太好。 
    于是,我选择在move中调用imageview地线程。有人会想,这样会不会启动N多个线程呢?move一直在移动呢。“在iamgeview判断下线程的状态即可,如果已经启动了,就不启动呗”。或许这么写不太好,但我认为是实时的,用户体验好。看代码:

    /**  
         * 获取待监控的view对象  
         * 实时调起线程,监控是否scroll停止,来判断是否需要显示imageView  
         * @param targetView 需要监控的对象  
         */  
        public void tellMe(View targetView) {  
            if (targetView == null)  
                throw new IllegalArgumentException("please set targetView who to scrollTo");  
            if (this.targetView == null)  
                this.targetView = targetView;  
            if (!isStarting) {  
                new Thread(scanThread).start();  
            }  
        }  

    线程加了判断。此处不要传递scrollview的scrollY值进来。比喻当你手指离开屏幕后,之前传递进来的scrollY就已经过时了,scrollview仍在滑动。在消息回调里面实时获取再判断

    private class MyCallback implements Runnable {  
            @Override  
            public void run() {  
                /**  
                 * 获取实时的卷动值,不要传递scroll值给我  
                 */  
                endScrollX = targetView.getScrollX();  
                int scrollY = targetView.getScrollY();  
                if (endScrollY != scrollY) {  
                    endScrollY = scrollY;  
                } else {  
                    if (endScrollY >= limitHeight) {  
                        if (!thisStateVisible)  
                            visible();  
                    } else {  
                        if (thisStateVisible)  
                            gone();  
                    }  
                    /**  
                     * 已判定,卷动停止,显示或隐藏当前view已完成  
                     * 退出监控scroll线程  
                     */  
                    clearCallBacks();  
                }  
            }  
        } 
     final ScrollView scrollView = mScrollView.getRefreshableView();  
            //mScrollView.setOnTouchListener();  无效  
            scrollView.setOnTouchListener(new View.OnTouchListener() {  
                @Override  
                public boolean onTouch(View v, MotionEvent event) {  
                    switch (event.getAction()){  
                        case MotionEvent.ACTION_MOVE:  
                            imageView_to_top.tellMe(scrollView);  
                            break;  
                    }  
                    return false;  
                }  
            });  
    @Override  
        protected void onDestroy() {  
            imageView_to_top.clearCallBacks();  
            super.onDestroy();  
        }  

    参考:http://blog.csdn.net/fesdgasdgasdg/article/details/51809552 
    源码下载

  • 相关阅读:
    编译原理三大经典书籍
    c#之委托总结
    shell编程基础
    专家是什么?我真的想知道(转)
    linux sed
    判断一个脚本中的变量是否为空(转)
    JAVA Stack栈和Heap堆的区别(转)
    CMD获取当前目录的绝对路径 (转)
    RTP协议分析
    VS2010旗舰版安装图解
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7498251.html
Copyright © 2011-2022 走看看