关于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();   
        }   
    }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

线程加了判断。此处不要传递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();   
            }   
        }   
    } 
  • 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
  • 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
 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;   
            }   
        });  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
 @Override   
    protected void onDestroy() {   
        imageView_to_top.clearCallBacks();   
        super.onDestroy();   
    }  

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5534.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论