ViewPager2实现内部Item的动态滚动

简介: 最近接到了一个需求,大概类似如下图所示的一个样式(省略了部分细节,不影响大概)。

需求决定起因

最近接到了一个需求,大概类似如下图所示的一个样式(省略了部分细节,不影响大概)。

网络异常,图片无法展示
|


我们这是一个视频播放页+详情页,考虑到简单快捷,就想到了一个 ViewPager2 就可以实现,简单又快捷,为自己点赞。一想到如此easy,瞬时笑出了猪叫。当然RecyclerView也可以,用一个仿抖音的那种 LayoutManager 就行,但是为什么不呢,因为涉及到了视频播放,手动去处理一些生命周期和懒加载,总是非常麻烦,而且ViewPager2本身就是基于 RecyclerView ,所以何乐而不为呢。

当然有些同学会说了,这个玩意自定义一个可滑动的ViewGroup就行啊,这个方案也可以。但是首先你要考虑的东西就很多,如果视频详情页超出一屏呢,也就是内部用了 RecyclerView或者NestedScrollView 呢,是不是还需要处理一下滑动冲突,当然这也不是很困难,内部拦截法就可以搞定。然后写完后,相应的加载回调是不是得自己再手动定义一个接口去伪造。比如不可见,页面加载,总体相对来说并不是那么容易。

就在我以为又可以摸鱼一个ViewPager2就可以搞定之时。突然,产品同学发了新指示,下意识预感不妙。

产品:得加一个第一次使用时的提示啊,要不然用户都不知道页面可以下滑呢?效果我发你了,你看看:

下图为我实现好的简单样式,大意体会即可。


网络异常,图片无法展示
|


好家伙,不按套路出牌啊,我故作深沉,实则稳如老狗( ViewPager2 不是有一个 fakeDragBy() 方法设置偏移量吗),这个有点麻烦,我得考虑考虑。

接下来不却知道自己要开启了啪啪打脸时刻,满心欢喜,太easy啊,ViewPager2 真香🤣!

打脸时刻

于是熟练的开分支,切分支,写demo,调用方法,走起!

先看一下这个方法。

fakeDragBy()

用于模拟手指拖动效果,需要先调用 beginFakeDrag() 开启,结束后,需要调用 endFakeDrag() 关闭。

既然有这个方法,那不就很简单吗,伪代码如下:



查看效果如下:


示例
网络异常,图片无法展示
|


我裂开了😨,为什么会这样,我就属性动画里调了一下而已,去看一下源码。

ViewPager2.fakeDragBy(x)


内部最终是调用了RecyclerView的 scrollBy() ,也就是相对滑动,哦原来如此,难怪调了一下,滑了这么远。

解决方法

既然如此,ViewPager2是基于RecyclerView,那么我去调用RecyclerView滚动不就行吗,思路如下:

1.ViewPager2-> RecyclerView, RecyclerView默认是私有的,可以通过反射或者 getChildAt(0) 获取

2.RecyclerView不支持 scrollTo() ,可以通过 LinearLayouManager 去滚动

3.LinearLayoutManager-scrollToPositionWithOffset() 支持滚动到偏移位置


伪代码如下:

val layoutManager = (getChildAt(0) as? RecyclerView
        ?: return@apply).layoutManager as? LinearLayoutManager ?: return@apply
val oneAnimator = ValueAnimator.ofFloat(0f, -450f).apply {
    duration = 500
}
oneAnimator.addUpdateListener {
    layoutManager.scrollToPositionWithOffset(0, it.animatedValue as Int)
}
oneAnimator.start()

效果如最上面示例gif所示,这样就解决了ViewPager2-item动态滚动问题。

需要注意的点

就如我上面最开始分析时所述,如果详情页是可滑动的,那么就必须处理一下滑动冲突,相应的方式也很简单,使用内部拦截法,让滑动的View优先获得事件即可,当处于滑动View顶部时,再将事件还给父View.


后续

当然用ViewPager2去写仍然有种大材小用的感觉,毕竟只有两个item,所以,比较好的方式依然是使用自定义的滑动ViewGroup实现,所以我会在下篇博客来以一个自定义的方式来解决此问题。

目录
相关文章
|
9月前
|
机器学习/深度学习 自然语言处理 PyTorch
《移动端NLP模型部署指南:突破性能与资源瓶颈》
在数字化时代,自然语言处理(NLP)技术已广泛应用于智能语音助手和文本翻译软件。随着移动设备普及,移动端高效运行NLP模型的需求增长。然而,移动端资源受限,如何实现高效部署成为热点问题。解决方案包括模型压缩(如剪枝、量化、知识蒸馏)、选择适配的推理框架(如TensorFlow Lite、PyTorch Mobile、MNN、NCNN),以及利用硬件加速(如GPU、NPU)。通过结构优化和参数调整,结合这些技术手段,未来移动端将提供更流畅、智能的NLP服务,提升人机交互体验。
308 18
|
存储 监控 数据库
Android经典实战之OkDownload的文件分段下载及合成原理
本文介绍了 OkDownload,一个高效的 Android 下载引擎,支持多线程下载、断点续传等功能。文章详细描述了文件分段下载及合成原理,包括任务创建、断点续传、并行下载等步骤,并展示了如何通过多种机制保证下载的稳定性和完整性。
501 1
|
XML Java Android开发
Android Studio App开发之实现底部标签栏BottomNavigationView和自定义标签按钮实战(附源码 超详细必看)
Android Studio App开发之实现底部标签栏BottomNavigationView和自定义标签按钮实战(附源码 超详细必看)
1299 0
|
存储 安全 物联网
Android经典实战之跳转到系统设置页面或其他系统应用页面大全
本文首发于公众号“AntDream”,关注获取更多技巧。文章总结了Android开发中跳转至系统设置页面的方法,包括设备信息、Wi-Fi、显示与声音设置等,并涉及应用详情与电池优化页面。通过简单的Intent动作即可实现,需注意权限与版本兼容性。每日进步,尽在“AntDream”。
1340 2
|
监控 Java API
Android经典实战之OkDownload:一个经典强大的文件下载开源库,支持断点续传
本文介绍的 OkDownload 是一个专为 Android 设计的开源下载框架,支持多线程下载、断点续传和任务队列管理等功能,具备可靠性、灵活性和高性能特点。它提供了多种配置选项和监听器,便于开发者集成和扩展。尽管已多年未更新,但依然适用于大多数文件下载需求。
1053 1
|
JSON fastjson 数据格式
fastjson基本操作
fastjson基本操作
293 0
|
XML Android开发 数据格式
【Android 应用开发】Android - TabHost 选项卡功能用法详解
【Android 应用开发】Android - TabHost 选项卡功能用法详解
410 0
【Android 应用开发】Android - TabHost 选项卡功能用法详解
|
搜索推荐 Android开发 开发者
Android应用开发:实现自定义ViewPager2的完全指南
【5月更文挑战第23天】 在移动应用开发的领域中,为用户提供流畅且直观的界面体验至关重要。Android平台上的ViewPager2组件提供了一个强大的方式来实现可滑动的页面,但有时候默认的行为和样式可能无法满足特定的设计要求。本文将深入探讨如何通过创建一个自定义的ViewPager2来扩展其功能,包括实现新的转换效果、修改指示器样式以及增加触摸事件响应等。我们将提供详尽的步骤和代码示例,帮助开发者掌握创建高度定制的ViewPager2所需的关键概念和技术。
|
XML Android开发 UED
|
Android开发
Android--fragment与activity及两个fragment之间的跳转实现
在应用的交互中,我可能需要实现: 从当前的fragment跳转到另一个fragment 从当前的fragment跳转到一个activity中 从当前的activity跳转到一个fragment中 网上提供的思路较多,这里总结了一套自己的方法。
2296 0