先上效果图吧:

第一个想到的实现方式是上面使用horizontalScrollview,下面使用Viewpager,经过尝试之后发现二者API有限,不能达到理想效果。几经折腾,最后上下都使用了自定义的RecyclerView。效果图如下:

现在来分析技术点,首先是上下联动,思路是在Recycleview的onScrolled回调方法中操作另一个Recycleview的滑动。

1 @Override
2 public void onScrolled(int dx, int dy) {
3     super.onScrolled(dx, dy);
4     sx = sx +dx;
5     if (scrollViewListener != null && isMark) {
6         scrollViewListener.onScrollChanged(this, sx, 0);
7     }
8 }

其中onScrollChanged方法在主页面中实现

 1 @Override
 2 public void onScrollChanged(Object scrollView, int x, int y) {
 3     int width1 = CommonUtil.getScreenWidth(this) - DensityUtils.dip2px(this, 60);
 4     int width2 = CommonUtil.getScreenWidth(this);
 5     if (scrollView == rvHead) {
 6         rvFoot.setmark(false);
 7         rvFoot.scrollTo(x * width2 / width1, y);
 8     } else if (scrollView == rvFoot) {
 9         rvHead.setmark(false);
10         rvHead.scrollTo(x * width1 / width2, y);
11     }
12     rvHead.setmark(true);
13     rvFoot.setmark(true);
14 }

上下View的滑动速率差即为上下RecyclerView中item的宽度差,上面view中item的宽度为屏幕宽度-60dp,详见对应的adapter。

由于RecyclerView中scrollTo方法没有实现,所以直接想到的是用scroolBy代替,但由于滑动回调返回的是Int值,经过速率差处理后精度丢失,得不到准确值,导致联动效果达不到,痛定思痛,最后还是自己来重写scrollTo方法:

1 @Override
2 public void scrollTo(int x, int y) {
3     scrollBy(x-sx,0);
4 }

sx为自己在onScrolled方法中记录,具体见文末给出的源码。

滑动之后,还要进行回调处理,以达到像viewPager那样的回弹效果,具体逻辑在自定义的RecyclerView中的回调方法onScrollStateChanged中实现:

 1 public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
 2         super.onScrollStateChanged(recyclerView, newState);
 3         if (newState == RecyclerView.SCROLL_STATE_IDLE) {
 4             int mmSelected;
 5             //当控件停止滚动时,获取可视范围第一个item的位置,滚动调整控件以使选中的item刚好处于正中间
 6             int firstVisiblePos = mLayoutManager.findFirstVisibleItemPosition();
 7             if (firstVisiblePos == RecyclerView.NO_POSITION) {
 8                 return;
 9             }
10             Rect rect = new Rect();
11             mLayoutManager.findViewByPosition(firstVisiblePos).getHitRect(rect);
12             if (Math.abs(rect.left) > mItemWidth / 2) {
13                 smoothScrollBy(rect.right, 0);
14                 mmSelected = firstVisiblePos + 1;
15             } else {
16                 smoothScrollBy(rect.left, 0);
17                 mmSelected = firstVisiblePos;
18             }
19             if (Math.abs(rect.left) == 0 && mOnSelectListener != null && mmSelected != mSelected) {
20                 mSelected = mmSelected;
21                 mOnSelectListener.onSelect(mSelected);
22             }
23         }
24     }
25 }

为了让滑动效果更为自然且支持fling效果,本项目还重写了RecyclerView的fling方法,使得每次fling都恰好能滑动整数个item,大致思路为调整fling初始速率,代码如下:

 1 @Override
 2 public boolean fling(int velocityX, int velocityY) {
 3     int v;
 4     int touchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
 5     if (Math.abs(velocityX) <= 3*touchSlop) {
 6         return false;
 7     }
 8     mPhysicalCoeff = SensorManager.GRAVITY_EARTH   // g (m/s^2)
 9             * 39.37f               // inch/meter
10             * getContext().getResources().getDisplayMetrics().density * 160.0f                 // pixels per inch
11             * 0.84f;
12     int firstVisiblePos = mLayoutManager.findFirstVisibleItemPosition();
13     if (firstVisiblePos == RecyclerView.NO_POSITION) {
14         return false;
15     }
16     Rect rect = new Rect();
17     mLayoutManager.findViewByPosition(firstVisiblePos).getHitRect(rect);
18     double n = getSplineFlingDistance(velocityX) / mItemWidth;
19     int num = Double.valueOf(n).intValue();
20     if (velocityX > 0)
21         v = Double.valueOf(getVelocityByDistance(num * mItemWidth + Math.abs(rect.right)- DensityUtils.dip2px(getContext(), 20))).intValue();
22     else
23         v = Double.valueOf(getVelocityByDistance(num * mItemWidth + Math.abs(rect.left)+ DensityUtils.dip2px(getContext(), 20))).intValue();
24     if (velocityX < 0) {
25         v = -v;
26     }
27     return super.fling(v, velocityY);
28 }

转载于:https://www.cnblogs.com/huolongluo/p/9102682.html

“京东金融”主页效果 RecyclerView联动相关推荐

  1. 双十一购物狂欢节!顶级布局优雅实现京东支付宝主页效果!

    又到了一年一度的双十一购物狂欢节! 这个时候女生们都在忙着打开淘宝京东进行疯狂的购物,点开网页就会出现各种各样打折商品,吸引眼球,引起女生们的购买欲: 而男生们则忙着打开微信支付宝,为自己的女朋友清空 ...

  2. iOS开发 -- UIScrollView 仿京东金融首页效果

    京东金融效果如下: 代码地址:https://github.com/bybyWind/ImitateJDjrApp.git 先搭建三个UIScrollVIew: @property(nonatomic ...

  3. 实现京东金融-悬浮框效果

    有些app在某些页面中会有悬浮框效果,这里以京东金融为模板 here: 这种效果,首先想到跟滑动代理有关系. 首先新建一个tableView //声明 @property (nonatomic, st ...

  4. ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果

    ios开发oc高仿京东金融白条额度余额的   ios开发水波纹   ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...

  5. ios开发oc高仿京东金融白条额度余额的 ios开发水波纹 ios开发水正弦曲线波纹 ios开发雷达扫描的动画效果...

    ios开发oc高仿京东金融白条额度余额的   ios开发水波纹   ios开发水正弦曲线波纹 直接上代码,复制粘贴就可以 vc里的 WaterRippleView *topView = [[Water ...

  6. 活动实录 | 京东金融PE谈如何颠覆应用运维认知

    导读:[GO SRE!] 为数人云SRE系列活动专题,本文是3月4日北京站线下活动"当西方的SRE遇上东方的互联网"中京东金融王超老师的分享. 他将从SRE,Devops, PE间 ...

  7. 京东金融科技学堂开班,AI 在金融云上有了新成果

    3 月 29 日在北京召开的第九届长江青投论坛上,长江商学院创办院长宣布与京东金融合作的金融科技学堂首期班正式开班. 从参与学员来看,首期班共有 40 位金融科技领域的精英和创业者参加,包括真融宝创始 ...

  8. 京东金融晒 “打黑成绩单”:一年内避免用户损失上亿元

    "自2016年12月以来,京东金融风控打黑项目团队共推动和深度配合各地公安机关破获网络黑产案件29起,打掉黑产团伙13个,抓获犯罪嫌疑人118人,避免用户损失上亿元."11月30日 ...

  9. 金融产品京东金融2015年战略主攻三大方向:股权众筹、农村金融和校园金融...

    导读:2014年是京东金融全力奔跑的一年,2015年京东金融业务将会在三个方面发力:上线股权众筹平台,发力农村金融和校园金融 2014年,凭借京东白条.京保贝.京东众筹等产品,京东金融迅速在互联网金融 ...

最新文章

  1. 娃哈哈信息部李钒助阵FBS2017 共探食品饮料信息化之路
  2. JS获取并操作iframe中元素的方法
  3. nginx+keepalived安装配置(整理中)
  4. 一个IT人士的个人经历,给迷失方向的朋友
  5. php转化xml数组_PHP实现数组array转换成xml的方法
  6. Android 屏幕适配攻略(四)获取手机屏幕的相关信息 与动态设置控件的大小
  7. Dubbo(RPC原理、Dubbo架构负载均衡配置方式)(1)
  8. Python批量导入图片生成能治疗颈椎病的HTML5版课件
  9. 蔡先生论道大数据之八: 让他在看小说的时候, 看到喜欢的汽车
  10. Oracle设置主键自增
  11. mysql个人记账系统_个人记账系统
  12. VHDL三段式状态机
  13. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  14. Windows添加系统桌面常用图标
  15. CeoMax总裁WordPress模板3.8.1免受权版本
  16. [DA45] 时间序列预测上证指数
  17. Codeforces Round #750 (Div. 2)A-F1补题题解
  18. Calendar 获得当前日期是这一年的第几天
  19. 最大值最小值算法(象棋博弈)
  20. 标准库intrins.h中的循环指令在多种流水灯方式上的应用

热门文章

  1. 当导入js文件时报了Cannot set property 'marginRight' of undefined
  2. 网络安全-john-the-ripper哈希破解
  3. nrf52810/nrf52811/nrf52820 freeertos移植
  4. 【PTA】读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。C语言
  5. 写一写拿到一台vps以后要做的事情(二)
  6. 农场游戏开发记录十四
  7. ibaanalyzer使用教程_ibaPDA client软件快速设置方法资料.doc
  8. spring aop 实现系统操作日志记录存储到数据库
  9. 小程序富文本解析wxParse 安卓手机部分不支持的一种情形
  10. 运维工作经历及技术学习过程