android组件的下拉回弹,转:Android可以下拉/上拉回弹的ListView原理
可是为什么直接用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原理相关推荐
- Android之Windows下搭建React Native Android开发环境(差不多搞了一天)
Android之Windows下搭建React Native Android开发环境 穷逼买不起mac,但是他们都说React Native Android只能在mac下面 ...
- android组件的下拉回弹,Android自定义控件仿ios下拉回弹效果
网上有很多类似的文章,大多数还是继承listview来实现(主要是listview.addHeaderView()和listview.addFooterView在listview的首尾添加view,也 ...
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
为什么80%的码农都做不了架构师?>>> 随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 M ...
- php中手机端ajax上拉加载更多,jQuery手机网页上拉加载更多
手机网页和PC网页都可以使用的上拉加载更多内容,其中LoadingDataFn自己改为ajax加载就可以了var page = 1, //分页码 off_on = false, //分页开关(滚动加载 ...
- Android组件化下依赖统一管理
使用Gradle进行依赖统一管理 前言 依赖统一管理使用步骤 第一步:定义versions.gradle文件 第二步:编辑版本内容 第三步:在project的build.gradle进行引用我们新建的 ...
- ffmpeg for android windows,windows10下编译ffmpeg for android
最近实现了一款基于FFMpeg的支持多路视频的实时流媒体播放器:https://github.com/huweijian5/RtspPlayer 有兴趣能够关注下.html 本文记录在windows1 ...
- android组件模板,提高效率必备神器 ---- Android Studio模板详解
原标题:提高效率必备神器 ---- Android Studio模板详解 Android Studio模板大家应该很熟悉,你新建一个project或者module的时候,AS会帮你提供几个选项供你选择 ...
- Android 组件化面试必备(1),Android面试题2020
如果我们要为某个已经存在的组件,重新开发一个新组件,将变得非常可行. 组件内的重构也将变得非常可行. 新的组件的设计只要保证对外提供的接口,完全符合,旧组件对外提供的接口 5.组件的热插拔,成为可能( ...
- android 字体加下划线,如何在Android TextView中将字体样式设置为粗体,斜体和下划线?...
我想让TextView的内容变得粗体,斜体和下划线. 我尝试了如下代码而且它能够工做,但没有强调. android 我该怎么作? 任何快速的想法? 编程 #1楼 这是添加下划线的简单方法,同时保持其余 ...
最新文章
- WebConfig的经典使用,大家一起交流一下吧!!!
- 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google
- poj 1011 Sticks 搜索
- python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
- linux hexdump显示格式c数组,hexdump命令
- 苹果AirPods 2预计将于3月25日发布 3月29日正式开卖
- 基于深度学习的自然场景文字检测及端到端的OCR中文文字识别
- SSM网上超市购物商城管理系统、
- linux上的smartsvn图形客户端,linux 下svn图形客户端smartsvn 安装
- 爱忘事、不自律,有了这5款时间管理工具,堪比“罗志祥”!
- AI面试官来临,教你三招搞定他
- 记忆力:魔方基础教程
- Java实现腾讯企业邮箱收发邮件
- RocketMQ一个新的消费组初次启动时从何处开始消费呢?
- unity的九宫格切割
- R SMOTE 报错 length of 'dimnames' [2] not equal to array extent
- Springboot + Shiro——MD5 盐值加密(配置)
- 关于移动端token解决方案
- 爬虫入门-爬取有道在线翻译结果(2)
- Unity上玩转数字人(Avatar)