列表滑动下面显示按钮,点击按钮回到顶部的功能,一般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 
源码下载

最新文章

  1. 匈牙利算法——S.B.S.
  2. 2015年ACM沈阳网络赛(准备做掉4道:)
  3. 从零学习storm(一) 环境的安装配置
  4. node + nginx + mongo搭建负载均衡
  5. windows 10环境下 使用 msys2 + vs code 配置 c++ 的编译环境
  6. Hibernate的关系配置
  7. Mapnik 编译安装过程
  8. QT 的信号与槽
  9. js 鼠标事件的抓取代码
  10. CCNP第二天 帧中继综合实验
  11. java String 去除空格
  12. STL 之 vector 用法
  13. Android Studio试用总结
  14. Event Sourcing - ENode(二)
  15. ABP官方文档翻译 2.7 对象到对象的映射
  16. qml demo分析(maroon-小游戏)
  17. pytorch Debug —交互式调试工具Pdb (ipdb是增强版的pdb)-1-在pytorch中使用
  18. [转载]SpringMVC的Model参数绑定方式
  19. Windows和linux 文件互传
  20. Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别

热门文章

  1. spring中quatz的多定时任务配置图文详解
  2. Ruby. Vs . Python
  3. javascript中创建对象和实现继承
  4. (转)基于MVC4+EasyUI的Web开发框架形成之旅--权限控制
  5. PhotoZoom控制面板简介说明
  6. re模块findall函数用法
  7. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归
  8. 小白学习Spark系列六:Spark调参优化
  9. Python数据分析--------numpy数据打乱
  10. 51nod1072 - 威佐夫游戏【威佐夫博弈】