可是为什么直接用ListView看不到下拉效果呢?

其实这是因为版权的问题,这个下拉的效果是苹果先出的,大家也都知道苹果跟谷歌的版权纠纷,所以谷歌虽然也能做到下拉,但没有明确给出来,只是做了一个动画效果,就是拉到顶部或底部后继续拉会有个亮亮的光出现(注意是2.3之后的系统才有)。

接下来看看谷歌给我们提供了什么。

首先是View类内的overScrollBy方法。

protected boolean overScrollBy(int deltaX, int deltaY,

int scrollX, int scrollY,

int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY,

boolean isTouchEvent) {

final int overScrollMode = mOverScrollMode;

final boolean canScrollHorizontal =

computeHorizontalScrollRange() > computeHorizontalScrollExtent();

final boolean canScrollVertical =

computeVerticalScrollRange() > computeVerticalScrollExtent();

final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS ||

(overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal);

final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS ||

(overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical);

int newScrollX = scrollX + deltaX;

if (!overScrollHorizontal) {

maxOverScrollX = 0;

}

int newScrollY = scrollY + deltaY;

if (!overScrollVertical) {

maxOverScrollY = 0;

}

// Clamp values if at the limits and record

final int left = -maxOverScrollX;

final int right = maxOverScrollX + scrollRangeX;

final int top = -maxOverScrollY;

final int bottom = maxOverScrollY + scrollRangeY;

boolean clampedX = false;

if (newScrollX > right) {

newScrollX = right;

clampedX = true;

} else if (newScrollX < left) {

newScrollX = left;

clampedX = true;

}

boolean clampedY = false;

if (newScrollY > bottom) {

newScrollY = bottom;

clampedY = true;

} else if (newScrollY < top) {

newScrollY = top;

clampedY = true;

}

onOverScrolled(newScrollX, newScrollY, clampedX, clampedY);

return clampedX || clampedY;

}

其实View的这个方法已经帮我们实现了下拉、上拉,甚至左拉右拉都实现了!!

可是为什么ListView继承了View却没有实现下拉呢?

我们接下来到ListView中的overScrollBy看一下。

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

int scrollY, int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

Log.d("deltaX=" + deltaX + ";deltaY=" + deltaY + ";scrollX=" + scrollX

+ ";scrollY=" + scrollY + ";scrollRangeX=" + scrollRangeX

+ ";scrollRangeY=" + scrollRangeY + ";maxOverScrollX="

+ maxOverScrollX + ";maxOverScrollY=" + maxOverScrollY);

return false;

}

据我打印的结果,发现后面的maxOverScrollX、maxOverScrollY永远是0!!

原来如此,谷歌也真是机(jiao)智(hua),代码明明实现了,就是不明确摆出来,这样苹果也无话可说了。

那么知道了原因,要实现也下拉也简单,自定义一个类继承ListView,重写overScrollBy方法即可。

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

int scrollY, int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,

scrollRangeX, scrollRangeY, maxOverScrollX,

500, isTouchEvent);

}

上面的代码只是给maxOverScrollY硬性的给了个500的值,然后就可以下拉上拉了,很简单吧~~

PS:亲测有用,这种方法做出来的下拉ListView效果一般,也没有下拉刷新功能,如果要用到项目中的话,还是去找开源的下拉列表吧~~

android组件的下拉回弹,转:Android可以下拉/上拉回弹的ListView原理相关推荐

  1. Android之Windows下搭建React Native Android开发环境(差不多搞了一天)

    Android之Windows下搭建React Native Android开发环境               穷逼买不起mac,但是他们都说React Native Android只能在mac下面 ...

  2. android组件的下拉回弹,Android自定义控件仿ios下拉回弹效果

    网上有很多类似的文章,大多数还是继承listview来实现(主要是listview.addHeaderView()和listview.addFooterView在listview的首尾添加view,也 ...

  3. Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

    为什么80%的码农都做不了架构师?>>>    随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 M ...

  4. php中手机端ajax上拉加载更多,jQuery手机网页上拉加载更多

    手机网页和PC网页都可以使用的上拉加载更多内容,其中LoadingDataFn自己改为ajax加载就可以了var page = 1, //分页码 off_on = false, //分页开关(滚动加载 ...

  5. Android组件化下依赖统一管理

    使用Gradle进行依赖统一管理 前言 依赖统一管理使用步骤 第一步:定义versions.gradle文件 第二步:编辑版本内容 第三步:在project的build.gradle进行引用我们新建的 ...

  6. ffmpeg for android windows,windows10下编译ffmpeg for android

    最近实现了一款基于FFMpeg的支持多路视频的实时流媒体播放器:https://github.com/huweijian5/RtspPlayer 有兴趣能够关注下.html 本文记录在windows1 ...

  7. android组件模板,提高效率必备神器 ---- Android Studio模板详解

    原标题:提高效率必备神器 ---- Android Studio模板详解 Android Studio模板大家应该很熟悉,你新建一个project或者module的时候,AS会帮你提供几个选项供你选择 ...

  8. Android 组件化面试必备(1),Android面试题2020

    如果我们要为某个已经存在的组件,重新开发一个新组件,将变得非常可行. 组件内的重构也将变得非常可行. 新的组件的设计只要保证对外提供的接口,完全符合,旧组件对外提供的接口 5.组件的热插拔,成为可能( ...

  9. android 字体加下划线,如何在Android TextView中将字体样式设置为粗体,斜体和下划线?...

    我想让TextView的内容变得粗体,斜体和下划线. 我尝试了如下代码而且它能够工做,但没有强调. android 我该怎么作? 任何快速的想法? 编程 #1楼 这是添加下划线的简单方法,同时保持其余 ...

最新文章

  1. WebConfig的经典使用,大家一起交流一下吧!!!
  2. 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google
  3. poj 1011 Sticks 搜索
  4. python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
  5. linux hexdump显示格式c数组,hexdump命令
  6. 苹果AirPods 2预计将于3月25日发布 3月29日正式开卖
  7. 基于深度学习的自然场景文字检测及端到端的OCR中文文字识别
  8. SSM网上超市购物商城管理系统、
  9. linux上的smartsvn图形客户端,linux 下svn图形客户端smartsvn 安装
  10. 爱忘事、不自律,有了这5款时间管理工具,堪比“罗志祥”!
  11. AI面试官来临,教你三招搞定他
  12. 记忆力:魔方基础教程
  13. Java实现腾讯企业邮箱收发邮件
  14. RocketMQ一个新的消费组初次启动时从何处开始消费呢?
  15. unity的九宫格切割
  16. R SMOTE 报错 length of 'dimnames' [2] not equal to array extent
  17. Springboot + Shiro——MD5 盐值加密(配置)
  18. 关于移动端token解决方案
  19. 爬虫入门-爬取有道在线翻译结果(2)
  20. Unity上玩转数字人(Avatar)

热门文章

  1. 006 认识BeanNameAware
  2. 什么是可哈希的(hashable)
  3. 【输入法】Rime-中州韵 基本设置 附:官方定制指南
  4. AutoFac IoC DI 依赖注入
  5. java 中public 类
  6. Android为TV端助力 浅谈Aidl 通讯机制
  7. 6to5 – 让你即刻体验 ECMAScript 6 编程
  8. c# winform 打印 窗体 及 窗体控件内容 的 初级尝试
  9. 简记SqueezeNet
  10. 用编程语言和计算机沟通