直接进入主题,先来看一下京东的实现效果:

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下拉刷新完全解析,教你如何一分钟实现下拉刷新功能,高仿京东下拉刷新,轻松上手!...相关推荐

  1. 【android】高仿京东商城App,集成react-native热更功能

    简介 高仿京东商城项目具有完整的结构,代码整洁规范,结构清晰,集成React-Native热更功能,功能还在持续更新中-如果对你有帮助,给个star 使用kotlin语言开发,项目使用模块化开发,降低 ...

  2. android高仿京东快报(垂直循环滚动新闻栏)

    的android高仿京东快报(垂直循环滚动新闻栏) 标签: 机器人 2016年3月20日03:08 2676阅读人 评论(15)收藏举报    分类: 机器人(71)  版权声明:本文为博主原创文章, ...

  3. android高仿京东app

    仿京东app 采用组件化架构 屏幕适配方案可以较好解决多分辨率及同分辨率不同dpi适配: 全新组件化架构升级,相比之前的方案模块间更为解耦且使用更为方便: 本项目为仿京东项目,资源为抓包获取,项目框架 ...

  4. Android高仿京东、天猫下拉刷新

    说到下拉刷新,相信大家都不陌生,现在基本上每个项目都会用到.我们公司的项目一直都是使用SwipeRefreshLayout,官方的Material Design风格,好用少Bug.现在下拉刷新大概有下 ...

  5. android 高仿京东首页,android 粗略的 仿京东首页 嵌套方式滚动

    简单述说 最近没有什么事情,就看到了京东的首页,感觉还不错,但是我目前也只是粗略的模仿了出来. github 地址 V2版本 仿京东首页.gif 设计思路 简单画图.png 滚动黄色的recycleV ...

  6. android高仿京东秒杀,Android通过实现GridView的横向滚动实现仿京东秒杀效果

    实现GridView的横向滚动 效果如下图: 具体实现的代码 •1. 主界面布局代码:activity_main.xml android:layout_width="fill_parent& ...

  7. android高仿京东秒杀,Android仿京东首页秒杀倒计时

    本文实例为大家分享了Android仿京东首页秒杀倒计时的具体代码,供大家参考,具体内容如下 xml配置 android:layout_width="wrap_content" an ...

  8. android高仿微信下拉有页面,Android——(仿微信聊天界面布局实例)

    今天看郭霖<第一行代码>书上写了一个聊天窗体的小例子,自己就练习学了一下.加上一些自己的理解整理了一下. 1.第一步首先是制作9.patch图片,这个在android  sdk 目录下to ...

  9. 高仿IOS下拉刷新的粘虫效果

    最近看需要做一款下拉刷新的效果,由于需要和Ios界面保持一致,所以这用安卓的方式实现了ios下的下拉刷新的粘虫效果. 最新的安卓手机版本的QQ也有这种类似的效果,就是拖动未读信息的那个红色圆圈,拖动近 ...

最新文章

  1. AI一分钟 |世界上第一个无人驾驶出租车在迪拜投入使用,2030年无人驾驶将覆盖迪拜25%的交通行程
  2. 博客 | Machine Learning Yearning 要点笔记
  3. 阿里从来不只属于马云,但马云会永远属于阿里
  4. 进程外Session和进程内Session存储
  5. wps重复上一步快捷键_WPS表格怎么快速输入重复内容?快速输入重复内容的详细步骤...
  6. OpenCV油画效果
  7. 执行完execute和update后存储过程变成invalid_学会反射后,我被面试官录取了(干货)
  8. javaee 中文帮助文档_从中游公司跳槽阿里必知:K8s、Nginx、Redis、微服务面试文档...
  9. SpringBoot 精通系列-创建SpringBoot的入门项目
  10. azure blob_如何在Azure Blob存储中恢复意外删除
  11. C++ 推断进程是否存在
  12. Echarts数据可视化radar雷达坐标系,开发全解+完美注释
  13. 西南科技大学OJ题 11 And 11! 0259
  14. Java毕设项目——大学生社团管理系统(java+SSM+Maven+Mysql+Jsp)
  15. Java面试复习体系总结(2021版,持续更新)
  16. PCD文件的rgb格式
  17. Vue项目关闭语法检查
  18. 日月年时分秒转换为年月日时分秒
  19. seaborn保存图片
  20. discuz mysql 配置_Discuz如何修改数据库配置?

热门文章

  1. python中 和 的区别_举例子让你明白python中is和==的区别
  2. php删除下拉框记录,删除一条数据_php删除一条记录(删除确认提示)
  3. 服务器powershell占用百分百,使用PowerShell统计服务器C盘空间
  4. 云栖社区 mysql_mysql
  5. iis web服务扩展_Web服务器系统都有哪些类型?都有什么优点呢?
  6. ubuntu openssl_在Ubuntu下安装旧版seurat
  7. fuck-KUNLUN昆仑ECRS会员管理系统
  8. Scala实现Mapreduce程序4-----数据去重
  9. [LeetCode]Trapping Rain Water
  10. Mac使用NDK编译FFmpeg4.0.2单独so库(验证可用)