android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能,高仿京东下拉刷新,轻松上手!...
直接进入主题,先来看一下京东的实现效果:
jd.gif
以及我自己的实现效果:
myjd.gif
实现过程
1.下拉原理
layout.png
整个布局为继承自LinearLayout的Viewgroup,分为头部及下面的列表部分,通过设置HeaderView的topMargin属性为负使HeaderView向屏幕上方偏移。
初始化时设置HeaderView的topMargin为负的HeaderView的高度可以将HeaderView完全隐藏,从而屏幕中只看得到列表部分。下拉过程中根据手指划过的距离不断更新HeaderView的topMargin值来改变HeaderView的可视范围从而达到下拉的效果。
2.效果实现
观察京东客户端的下拉过程,可以看出下拉过程中快递员和包裹是不断放大的并且透明度在增加,当HeaderView完全可见时达到最大值并且快递员“取到”包裹,松开手后快递员开始“拼命送货”。
其中放大效果我是用ScaleDrawable实现,通过手指划过的位移改变Drawable的level从而改变图片的大小,不熟悉ScaleDrawable的可以参考Android Drawable之ScaleDrawable。松开手后快递员奔跑是由帧动画实现。
3.关键代码
拦截部分:
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mTouchY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float dy = event.getY() - mTouchY;
//当RecyclerView移到顶部并且手指向下滑动时,拦截事件,由自己处理Touch事件
if (dy > 0 && canPull)
return true;
case MotionEvent.ACTION_UP:
default:
break;
}
return false;
}
滑动部分:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
float dy = event.getY() - mTouchY;
mTouchY = event.getY();
if (Math.abs(mTouchY)
break;
if (mCurrentStatus != STATUS_REFRESHING) {
//除以2是增加下拉的阻力感
headerLayoutParams.topMargin += dy / 2;
//此时为向上滑动到头部完全隐藏的情况,继续滑动的话应该交由RecyclerView处理了,故返回false自己不消耗事件。
if (headerLayoutParams.topMargin<=hideHeaderHeight){
headerLayoutParams.topMargin=hideHeaderHeight;
mHeaderView.requestLayout();
return false;
}
//此时为头部完全显示的情况
if (headerLayoutParams.topMargin>=0){
mCurrentStatus = STATUS_RELEASE_TO_REFRESH;
}else {
mCurrentStatus = STATUS_PULL_TO_REFRESH;
//改变图片的大小及透明度
onLevelChanged((hideHeaderHeight-headerLayoutParams.topMargin)*100/hideHeaderHeight);
}
mHeaderView.requestLayout();
}
break;
case MotionEvent.ACTION_UP:
if (mCurrentStatus == STATUS_PULL_TO_REFRESH){
//属性动画实现平滑滚动
headerAnimation(headerLayoutParams.topMargin,hideHeaderHeight,350,null);
}else if (mCurrentStatus == STATUS_RELEASE_TO_REFRESH){
mCurrentStatus = STATUS_REFRESHING;
headerAnimation(headerLayoutParams.topMargin,0,250,null);
if (listener!=null)
listener.onRefresh();
}
break;
}
updateHeaderView();
lastStatus = mCurrentStatus;
return super.onTouchEvent(event);
}
android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能,高仿京东下拉刷新,轻松上手!...相关推荐
- 【android】高仿京东商城App,集成react-native热更功能
简介 高仿京东商城项目具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,功能还在持续更新中-如果对你有帮助,给个star 使用kotlin语言开发,项目使用模块化开发,降低 ...
- android高仿京东快报(垂直循环滚动新闻栏)
的android高仿京东快报(垂直循环滚动新闻栏) 标签: 机器人 2016年3月20日03:08 2676阅读人 评论(15)收藏举报 分类: 机器人(71) 版权声明:本文为博主原创文章, ...
- android高仿京东app
仿京东app 采用组件化架构 屏幕适配方案可以较好解决多分辨率及同分辨率不同dpi适配: 全新组件化架构升级,相比之前的方案模块间更为解耦且使用更为方便: 本项目为仿京东项目,资源为抓包获取,项目框架 ...
- Android高仿京东、天猫下拉刷新
说到下拉刷新,相信大家都不陌生,现在基本上每个项目都会用到.我们公司的项目一直都是使用SwipeRefreshLayout,官方的Material Design风格,好用少Bug.现在下拉刷新大概有下 ...
- android 高仿京东首页,android 粗略的 仿京东首页 嵌套方式滚动
简单述说 最近没有什么事情,就看到了京东的首页,感觉还不错,但是我目前也只是粗略的模仿了出来. github 地址 V2版本 仿京东首页.gif 设计思路 简单画图.png 滚动黄色的recycleV ...
- android高仿京东秒杀,Android通过实现GridView的横向滚动实现仿京东秒杀效果
实现GridView的横向滚动 效果如下图: 具体实现的代码 •1. 主界面布局代码:activity_main.xml android:layout_width="fill_parent& ...
- android高仿京东秒杀,Android仿京东首页秒杀倒计时
本文实例为大家分享了Android仿京东首页秒杀倒计时的具体代码,供大家参考,具体内容如下 xml配置 android:layout_width="wrap_content" an ...
- android高仿微信下拉有页面,Android——(仿微信聊天界面布局实例)
今天看郭霖<第一行代码>书上写了一个聊天窗体的小例子,自己就练习学了一下.加上一些自己的理解整理了一下. 1.第一步首先是制作9.patch图片,这个在android sdk 目录下to ...
- 高仿IOS下拉刷新的粘虫效果
最近看需要做一款下拉刷新的效果,由于需要和Ios界面保持一致,所以这用安卓的方式实现了ios下的下拉刷新的粘虫效果. 最新的安卓手机版本的QQ也有这种类似的效果,就是拖动未读信息的那个红色圆圈,拖动近 ...
最新文章
- AI一分钟 |世界上第一个无人驾驶出租车在迪拜投入使用,2030年无人驾驶将覆盖迪拜25%的交通行程
- 博客 | Machine Learning Yearning 要点笔记
- 阿里从来不只属于马云,但马云会永远属于阿里
- 进程外Session和进程内Session存储
- wps重复上一步快捷键_WPS表格怎么快速输入重复内容?快速输入重复内容的详细步骤...
- OpenCV油画效果
- 执行完execute和update后存储过程变成invalid_学会反射后,我被面试官录取了(干货)
- javaee 中文帮助文档_从中游公司跳槽阿里必知:K8s、Nginx、Redis、微服务面试文档...
- SpringBoot 精通系列-创建SpringBoot的入门项目
- azure blob_如何在Azure Blob存储中恢复意外删除
- C++ 推断进程是否存在
- Echarts数据可视化radar雷达坐标系,开发全解+完美注释
- 西南科技大学OJ题 11 And 11! 0259
- Java毕设项目——大学生社团管理系统(java+SSM+Maven+Mysql+Jsp)
- Java面试复习体系总结(2021版,持续更新)
- PCD文件的rgb格式
- Vue项目关闭语法检查
- 日月年时分秒转换为年月日时分秒
- seaborn保存图片
- discuz mysql 配置_Discuz如何修改数据库配置?
热门文章
- python中 和 的区别_举例子让你明白python中is和==的区别
- php删除下拉框记录,删除一条数据_php删除一条记录(删除确认提示)
- 服务器powershell占用百分百,使用PowerShell统计服务器C盘空间
- 云栖社区 mysql_mysql
- iis web服务扩展_Web服务器系统都有哪些类型?都有什么优点呢?
- ubuntu openssl_在Ubuntu下安装旧版seurat
- fuck-KUNLUN昆仑ECRS会员管理系统
- Scala实现Mapreduce程序4-----数据去重
- [LeetCode]Trapping Rain Water
- Mac使用NDK编译FFmpeg4.0.2单独so库(验证可用)