实现效果

image

使用

android:id="@+id/carousel"

android:layout_width="match_parent"

android:layout_height="match_parent"

app:carousel_angle="-30"

app:carousel_spacing="20dp"

app:carousel_speed="1" />

只需要通过设置Adapter就OK了

public void setAdapter(RecyclerView.Adapter adapter1, RecyclerView.Adapter adapter2, RecyclerView.Adapter adapter3) {

mRv1.setAdapter(adapter1);

mRv2.setAdapter(adapter2);

mRv3.setAdapter(adapter3);

}

属性说明

属性值

说明

carousel_angle

倾斜角度

默认-30°

carousel_spacing

列表之间的间隙,通常设置为recyclerView的item间距大小一致

dp

carousel_speed

速度,值越大传送越快,不小于0

默认1

可在代码中设置间隙 setGapSpacing

代码中设置角度 setAngle

代码中设置速度 setSpeed

需求分析

直观有 三条传送带式列表

一个正向移动 两个反向移动

有一个倾斜角度

可以循环展示

具体分析

根据样式 可以确定的是需要自定义ViewGroup来实现

结合列表的正向反向移动 可以确定:RecyclerView + LinearLayoutManager 可以做到

不停滚动借助 Scroller 来实现

倾斜角度 可以通过 setRatation() 方法来旋转一个角度

循环展示 通过设置 RecyclerView.Adapter的 itemCount 为 Inter.MAX_VALUE

具体实现

自定义CarouselLayout继承自ViewGroup

添加一个子View LinearLayout, setOrientation(LinearLayout.VERTICAL);

依次添加三个 RecyclerView,设置其 marginTop为 gapSpacing的值

mContainer = new LinearLayout(getContext());

mContainer.setOrientation(LinearLayout.VERTICAL);

addView(mContainer, generateDefaultLayoutParams());

mRv1 = new CarouselRecyclerView(getContext());

mRv2 = new CarouselRecyclerView(getContext());

mRv3 = new CarouselRecyclerView(getContext());

mContainer.addView(mRv1);

mContainer.addView(mRv2);

mContainer.addView(mRv3);

setSpacing();//此方法设置margin,详见代码

mRv1.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));

mRv2.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, true));

mRv3.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));

旋转一个角度

设置 LinearLayout 的rotation

mContainer.setRotation(mAngle);//旋转角度

设置LinearLayout的大小来保证切斜后仍可以占满全屏

由于在ViewGroup中最大的距离就是对角线,所以 设置 子View的宽高都为对角线的长度

//对角线长度

mDiagonalLine = (int) Math.sqrt(getMeasuredWidth() * getMeasuredWidth() + getMeasuredHeight() * getMeasuredHeight());

ViewGroup.LayoutParams params = mContainer.getLayoutParams();

params.width = mDiagonalLine;

params.height = mDiagonalLine;

mContainer.setLayoutParams(params);

移动起来

借助Scroller类来不断 调用 computeScroll方法实现滚动

@Override

public void computeScroll() {

super.computeScroll();

mRv1.scrollBy(mSpeed, 0);//speed 对应移动像素值

mRv2.scrollBy(-mSpeed, 0);

mRv3.scrollBy(mSpeed, 0);

if (mScroller.isFinished()) {

start();

}

}

其他

因为列表使用RecyclerView实现,所以我们手动还可以滑动它。

如果不想手动滑动的话,重写RecyclerView的onTouchEvent方法, return false;

无限循环

设置Adapter的时候

@Override

public int getItemCount() {

return Integer.MAX_VALUE;

}

然后在 onBindViewHolder 方法取item的时候 进行取余操作

String url = mSources[position % mSources.length];

后记

这个效果在微信阅读上是WebView实现的,我们的UI直接抄了过来。所以只能用Android代码实现一下。

如果有更好的实现方式,或者需要改进的地方,希望可以一起探讨。

微信读书android换到ios,Android 微信读书本周推荐传送带列表实现相关推荐

  1. 微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案

    微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案 参考文章: (1)微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案 (2)http ...

  2. 微信团队原创分享:iOS版微信的内存监控系统技术实践

    为什么80%的码农都做不了架构师?>>>    本文来自微信开发团队yangyang的技术分享. 一.前言 FOOM(Foreground Out Of Memory),是指App在 ...

  3. android换肤动画,Android换肤(二) — 插件式换肤

    ###前言 上节我们讲到了`Android-skin-support`库的应用内换肤,大家感兴趣的可以参看文章: [Android换肤(一) - 应用内换肤](http://www.demodashi ...

  4. android换主题功能,Android 切换主题风格(Theme换肤效果)

    参考 截图 1.默认打开 image.png 2.点击[换主题色] image.png 需知 主题色运用:manifest清单文件中application的属性之一,android:theme=&qu ...

  5. dakai微信小程序 ios_【iOS】微信小程序打开APP到底是怎么回事?

    前言 从苹果官方来看,小程序新增了两个功能: 1. 支持打开移动应用 2. 标题栏区域开放自定义 针对第二个功能,就是开发者可以自定义小程序菜单栏的颜色风格,根据需求,对小程序菜单外的标题区域进行自定 ...

  6. android换肤动画,Android动态换肤框架-实现换肤

    1.换肤流程 1 2.采集流程 2 3.Android资源查找流程 3 4.采集需要换肤的控件 换肤我们需要换所有可能需要换的页面控件,所以我们不可能在每个页面重新findviewById,这时就需要 ...

  7. android换自定义铃声,Android设置铃声实现代码

    本文实例讲述了Android设置铃声实现代码.分享给大家供大家参考.具体如下: public void setMyRingtone(File file) { ContentValues values ...

  8. 微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结

    1.引言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了. 记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶 ...

  9. 微信团队分享:iOS版微信的高性能通用key-value组件技术实践

    本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...

最新文章

  1. 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」
  2. Exchange 2013部署系列之(七)配置SSL多域名证书
  3. CentOS搭建本地光盘YUM源
  4. style=@android:style/buttonbar,Setting style=?android:attr/buttonBarStyle to parent layout and s...
  5. 如何使用eclipse创建Javaweb项目
  6. Java学习笔记(13)
  7. 快餐文化短视频源码行业竞争激烈,短视频发展任重道远
  8. Linux 下配置多机实时同步
  9. Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL) 1 1.1. 8.2 功能概述 1 1.2. Ongl
  10. 串口调试助手、网络调试助手
  11. 常见亲脂性细胞膜染料DiO, Dil, DiR, Did光谱图和实验操作流程
  12. numpy的narray数组与txt文件的相互转化
  13. 前端案例——2.仿淘宝关闭二维码案例
  14. 三种网线的RJ-45接头制作法图解(转)
  15. 实现表格中的el-switch 开关切换
  16. 趣味算法:国王和100个囚犯
  17. 小数点用计算机怎么用,用Windows计算器进行小数数制转换的方法
  18. Unity3D无缝拼接小技巧
  19. MPLS LSP的建立
  20. linux上的字典和数组中,centos安装词典——图形界面的和命令行

热门文章

  1. leetcode 2. Add Two Numbers | 2. 两数相加(Java)
  2. Leet Code OJ 83. Remove Duplicates from Sorted List [Difficulty: Easy]
  3. css fix 手机端,移动端布局fixed问题解决方案
  4. dict python用法_Python_Dict用法梳理
  5. AttributeMap类详解
  6. 【分析】1021 Deepest Root (25 分)【DFS解法】
  7. 【已解决】[Error] cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_s
  8. L1-011 A-B(13行代码AC!!)
  9. Web前端开发笔记——第三章 CSS语言 第五节 盒子模型
  10. java 简单的计算器程序,Java 简易计算器程序