关于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();  
    }  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏三好码农的三亩自留地

Android触摸事件传递(下)

  上一篇中,我说明了Android中Activity和View触摸事件的传递流程,现在我们来继续学习MotionEvent在View的容器ViewGroup中...

821
来自专栏飞雪无情的博客

Android TextView小组件的使用--附带超链接和跑马灯效果

然后运行该应用就可以看到TextView的效果,是显示一行字:“Hello World, HelloTextView!”,这是因为新建的Hello项目自带的一个...

955
来自专栏向治洪

Selector使用

Selector使用 Selector使其能够在不同的状态下更换某个View的背景图片。 <?xml version="1.0" encoding="utf-8...

2188
来自专栏青蛙要fly的专栏

项目需求讨论-标题栏上的搜索功能

今天讲的就是一个很简单的具体开始时候遇到的需求,在标题栏中实现搜索功能,而且美工要求需要实现下面GIF图的效果,我就实现了下,可能不是最好的,有哪里可以更方便请...

1011
来自专栏向治洪

Android优化之Hardware Layer

项目中越来越多的动画,越来越多的效果导致了应用性能越来越低。该如何提升。 简介 在View播放动画的过程中每一帧都需要被重绘。如果使用view layer...

2809
来自专栏Python小屋

Python+tkinter动态创建与销毁组件小案例

本文代码演示了如何在tkinter窗体上动态创建组件以及销毁组件的方法。 import tkinter import tkinter.messagebox im...

6396
来自专栏向治洪

Android优化之Hardware Layer

项目中越来越多的动画,越来越多的效果导致了应用性能越来越低。该如何提升。 ###简介 在View播放动画的过程中每一帧都需要被重绘。如果使用view l...

1965
来自专栏分享达人秀

自定义ProgressBar打造酷炫进度条

Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar。 在Android开发中,...

1.1K5
来自专栏狂码一生

利用JS插件QRCode.js生成二维码

QRCode.js 是一个用于生成二维码图片的插件。 QRCode.js文件下载地址: 点击直接下载 Step 1、引入qrcode.js插件包: <scrip...

4307
来自专栏分享达人秀

两分钟掌握数值选择器NumberPicker

上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器NumberPicker 。 一...

2126

扫码关注云+社区

领取腾讯云代金券