微信读书android换到ios,Android 微信读书本周推荐传送带列表实现
实现效果
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 微信读书本周推荐传送带列表实现相关推荐
- 微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案
微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案 参考文章: (1)微信扫描二维码实现自动跳转 微信直接下载App(iOS/Android)的解决方案 (2)http ...
- 微信团队原创分享:iOS版微信的内存监控系统技术实践
为什么80%的码农都做不了架构师?>>> 本文来自微信开发团队yangyang的技术分享. 一.前言 FOOM(Foreground Out Of Memory),是指App在 ...
- android换肤动画,Android换肤(二) — 插件式换肤
###前言 上节我们讲到了`Android-skin-support`库的应用内换肤,大家感兴趣的可以参看文章: [Android换肤(一) - 应用内换肤](http://www.demodashi ...
- android换主题功能,Android 切换主题风格(Theme换肤效果)
参考 截图 1.默认打开 image.png 2.点击[换主题色] image.png 需知 主题色运用:manifest清单文件中application的属性之一,android:theme=&qu ...
- dakai微信小程序 ios_【iOS】微信小程序打开APP到底是怎么回事?
前言 从苹果官方来看,小程序新增了两个功能: 1. 支持打开移动应用 2. 标题栏区域开放自定义 针对第二个功能,就是开发者可以自定义小程序菜单栏的颜色风格,根据需求,对小程序菜单外的标题区域进行自定 ...
- android换肤动画,Android动态换肤框架-实现换肤
1.换肤流程 1 2.采集流程 2 3.Android资源查找流程 3 4.采集需要换肤的控件 换肤我们需要换所有可能需要换的页面控件,所以我们不可能在每个页面重新findviewById,这时就需要 ...
- android换自定义铃声,Android设置铃声实现代码
本文实例讲述了Android设置铃声实现代码.分享给大家供大家参考.具体如下: public void setMyRingtone(File file) { ContentValues values ...
- 微信团队分享:极致优化,iOS版微信编译速度3倍提升的实践总结
1.引言 岁月真是个养猪场,这几年,人胖了,微信代码也翻了. 记得 14 年转岗来微信时,用自己笔记本编译微信工程才十来分钟.如今用公司配的 17 年款 27-inch iMac 编译要接近半小时:偶 ...
- 微信团队分享:iOS版微信的高性能通用key-value组件技术实践
本文来自微信开发团队guoling的技术分享. 1.前言 本文要分享的是iOS版微信内部正在推广和使用的一个高性能通用key-value 组件的技术实践过程,该组件在微信内部被命名为MMKV(以下简称 ...
最新文章
- 豪赌 ARM 梦碎:63 岁孙正义的「花甲历险记」
- Exchange 2013部署系列之(七)配置SSL多域名证书
- CentOS搭建本地光盘YUM源
- style=@android:style/buttonbar,Setting style=?android:attr/buttonBarStyle to parent layout and s...
- 如何使用eclipse创建Javaweb项目
- Java学习笔记(13)
- 快餐文化短视频源码行业竞争激烈,短视频发展任重道远
- Linux 下配置多机实时同步
- Atitit prgrmlan topic--express lan QL query lan表达式语言 目录 1. 通用表达语言(CEL)	1 1.1. 8.2 功能概述	1 1.2. Ongl
- 串口调试助手、网络调试助手
- 常见亲脂性细胞膜染料DiO, Dil, DiR, Did光谱图和实验操作流程
- numpy的narray数组与txt文件的相互转化
- 前端案例——2.仿淘宝关闭二维码案例
- 三种网线的RJ-45接头制作法图解(转)
- 实现表格中的el-switch 开关切换
- 趣味算法:国王和100个囚犯
- 小数点用计算机怎么用,用Windows计算器进行小数数制转换的方法
- Unity3D无缝拼接小技巧
- MPLS LSP的建立
- linux上的字典和数组中,centos安装词典——图形界面的和命令行
热门文章
- leetcode 2. Add Two Numbers | 2. 两数相加(Java)
- Leet Code OJ 83. Remove Duplicates from Sorted List [Difficulty: Easy]
- css fix 手机端,移动端布局fixed问题解决方案
- dict python用法_Python_Dict用法梳理
- AttributeMap类详解
- 【分析】1021 Deepest Root (25 分)【DFS解法】
- 【已解决】[Error] cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_s
- L1-011 A-B(13行代码AC!!)
- Web前端开发笔记——第三章 CSS语言 第五节 盒子模型
- java 简单的计算器程序,Java 简易计算器程序