如何在Jetpack Compose中将可滚动项捕捉到屏幕中心

news2024/11/20 14:39:21

如何在Jetpack Compose中将可滚动项捕捉到屏幕中心

Snapper 迁移到 SnapFlingBehavior
article logo

之前,我们探讨了Android应用程序开发中一个常见的用例:在fling手势后将可滚动项捕捉到屏幕中心。

为了在Jetpack Compose中实现这一目标,我们使用了之前被存档的"Snapper"库。当官方框架还没有支持时,Snapper提供了一种无缝的解决方案,用于在可滚动布局中实现捕捉行为。如果你错过了那篇文章,你可以在这里阅读。

自那时以来,Jetpack Compose已经发展壮大,好消息是,我们之前使用Snapper库实现的功能现在已经在Jetpack Compose中得到官方支持,引入了SnapFlingBehavior。这个新的类提供了一个更全面和高效的解决方案,用于在具有动态内容的可滚动列表中将项居中。

在本文中,我们将重新讨论我们在之前的文章中解决的问题,并演示如何从使用Snapper库过渡到官方支持的SnapFlingBehavior。我们将首先讨论两种方法之间的主要区别,然后提供一步一步的指南,用于在Jetpack Compose项目中实现SnapFlingBehavior

转换为SnapFlingBehavior

为了快速回顾一下,让我们来看看我们使用Snapper实现的核心功能。该库允许我们创建一个动态的可滚动列表,在fling手势后将项目捕捉到屏幕中心。当Jetpack Compose没有官方实现此用例的功能时,它是一个很好的解决方案。
通过引入SnapFlingBehavior,我们现在可以使用Jetpack Compose的官方API实现此捕捉行为。相比Snapper库,SnapFlingBehavior提供了更大的灵活性和自定义选项。
SnapFlingBehavior类使项目捕捉到给定位置,使用shortSnapVelocityThreshold参数区分短/滚动捕捉和长/fling捕捉。此外,它还为不同情况提供了各种动画规格,例如highVelocityAnimationSpeclowVelocityAnimationSpecsnapAnimationSpec
现在让我们看看如何利用SnapFlingBehavior来实现我们之前使用Snapper库实现的相同功能。

重新审视我们以前的用例

在我上一篇关于Snapper库的文章中,我们使用了一个动态列表的例子:

@Composable
fun MainContent(
    placeholderItems: List<String>
) {

    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {

        Text(
            modifier = Modifier
                .padding(16.dp)
                .fillMaxWidth(),
            text = "Example Horizontal LazyRow"
        )

        LazyRow(
            modifier = Modifier.fillMaxWidth(),
            contentPadding = PaddingValues(8.dp),
            verticalAlignment = Alignment.CenterVertically
        ) {
            items(items = placeholderItems) { itemMessage: String ->
                PlaceholderCard(itemMessage)
            }
        }
    }
}

实际效果如下:
LazyRow default behavior
我们可以使用 Snapper 实现 fling 行为,如下代码片段所示:

val lazyListState: LazyListState = rememberLazyListState()
  val layoutInfo: LazyListSnapperLayoutInfo = rememberLazyListSnapperLayoutInfo(lazyListState)

  LazyRow(
      modifier = Modifier.fillMaxWidth(),
      state = lazyListState,
      flingBehavior = rememberSnapperFlingBehavior(lazyListState),
      contentPadding = PaddingValues(8.dp),
      verticalAlignment = Alignment.CenterVertically,
  ) {
      items(items = placeholderItems) { itemMessage: String ->
          PlaceholderCard(itemMessage)
      }
  }

使用SnapFlingBehavior

但是,为了确保在执行 fling 手势后可见项目滚动到屏幕中心,我们不再需要依赖外部库。相反,我们可以利用前面讨论的 SnapFlingBehavior

下面的代码片段显示了启用 SnapFlingBehavior MainContent

@Composable
fun MainContent(
    placeholderItems: List<String>
) {

    Column(
        modifier = Modifier.fillMaxSize(),
        horizontalAlignment = Alignment.CenterHorizontally,
        verticalArrangement = Arrangement.Center
    ) {

        Text(
            modifier = Modifier
                .padding(16.dp)
                .fillMaxWidth(),
            text = "Example Horizontal LazyRow"
        )

        val listState: LazyListState = rememberLazyListState()

        LazyRow(
            modifier = Modifier.fillMaxWidth(),
            contentPadding = PaddingValues(horizontal = 32.dp),
            verticalAlignment = Alignment.CenterVertically,
            state = listState,
            flingBehavior = rememberSnapFlingBehavior(listState)
        ) {
            items(placeholderItems) { item: String ->
                PlaceholderCard(itemMessage = item)
            }
        }
    }
}

首先,我们使用rememberLazyListState()函数创建一个LazyListState,这允许我们存储和管理我们的LazyRow组件的状态:

val listState: LazyListState = rememberLazyListState()

接下来,我们使用以下属性定义了 LazyRow 组件:

  • modifier = Modifier.fillMaxWidth():确保 LazyRow 横跨整个屏幕的宽度。
  • contentPadding = PaddingValues(horizontal = 32.dp):在 LazyRow 内部应用水平方向为 32.dp 的填充。
  • verticalAlignment = Alignment.CenterVertically:将 LazyRow 中的项在垂直方向上居中对齐。
  • state = listState:将我们之前定义的 LazyListState 设置为 LazyRow 的状态。
  • flingBehavior = rememberSnapFlingBehavior(listState):通过提供 listState,将 SnapFlingBehavior 分配给 LazyRow,从而使列表中的项在 fling 手势后捕捉到中心并最终实现所需的行为。

最终效果如下:
LazyRow with SnapFlingBehavior

结论

本文中,我们重温了在Jetpack Compose中将可滚动项捕捉到屏幕中央的问题,并从使用Snapper库转换为官方支持的SnapFlingBehavior
我们首先看到了我们以前是如何实现动态、可滚动列表的,它在手势滑动后自动将项目捕捉到屏幕中央。随后,我们讨论了使用官方解决方案的相同方法。最后,我们发现在代码长度方面的差异并不大,迁移过程非常简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手把手教你写Web自动化测试并生成美观交互的测试报告

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 摘要&#xff1a; Web自动化测试 Allure测试报告 总结 摘要&#xff1a; 在Web应用程序开发中&#xff0c…

ICV: 全球QRNG产业规模在2030年有望突破200亿美元

近日&#xff0c;专注于前沿科技领域的国际咨询机构ICV发布了《全球量子随机数发生器的产业研究报告》&#xff0c;从多个角度对QRNG的市场进行预测。 QRNG 是解决与随机数相关的问题&#xff08;例如密码解决方案&#xff09;的重要硬件来源。 QRNG 是随着量子物理技术的发展…

DJ4-4 基本分页存储管理方式

目录 离散分配的基本概念 4.4.1 分页存储管理基本思想 1、分页存储管理的基本方法 2、页面与物理块 3、实现分页存储管理的数据结构 4、实现分页存储管理的地址结构 5、分页存储管理的逻辑地址表示 4.4.2 地址变换机构 1、基本的地址变换机构 2、具有快表的地址变换…

Alibaba技术官熬夜肝出的,Kafka “限量笔记” 牛掰 ~

前言 分布式&#xff0c;是程序员必备技能之一&#xff0c;在面试过程中属于必备类的&#xff0c;在工作中更是会经常用到。而Kafka是一个分布式的基于发布订阅的消息队列&#xff0c;目前它的魅力是无穷的&#xff0c;对于Kafka的奥秘&#xff0c;还需要我们细细去探寻。 要…

GUN C编译器拓展语法学习笔记(三)内联函数、内建函数与可变参数宏

内联函数、内建函数与可变参数宏 一、内联函数1.1 属性声明&#xff1a;noinline1.2 内联函数与宏1.3 编译器对内联函数的处理1.4 内联函数为什么定义在头文件中 二、内建函数2.1 内建函数定义2.2 常用的内建函数2.3 C标准库的内建函数2.4 内建函数&#xff1a;__builtin_const…

WPF异常处理详解

总目录 文章目录 总目录一、WPF异常1 未捕获异常2 模拟未捕获异常场景 二、处理未捕获异常1 DispatcherUnhandledException 异常捕获2 UnhandledException异常捕获3 UnobservedTaskException异常捕获4 异常捕获的综合使用 结语 一、WPF异常 1 未捕获异常 正常情况下&#xff…

《走进对象村5》面向对象的第二大特性——继承

文章目录 &#x1f680;文章导读1.1 为什么需要继承1.2 继承的概念**关于继承有如下三点请记住&#xff1a;**1.4 父类成员访问1.4.1 子类中访问父类成员变量1.4.2 super 关键字1.4.3 子类中访问父类成员方法 1.5 子类构造方法1.6 面试题this 和 super 的区别(重点)1.7 再谈代码…

深度解读绩效管理PDCA循环(含操作指南、案例应用)

绩效管理的PDCA循环是一个重要的管理工具&#xff0c;它由四个步骤组成&#xff1a;绩效计划&#xff08;Plan&#xff09;、绩效执行&#xff08;Do&#xff09;、绩效评估&#xff08;Check&#xff09;和结果应用&#xff08;Action&#xff09;。这个循环可以帮助组织不断地…

【红黑树】到底是什么,它有哪些基本操作,它的用处是什么,代码如何实现

红黑树是一种自平衡二叉查找树&#xff0c;具有良好的时间复杂度和空间复杂度&#xff0c;被广泛应用于计算机科学领域中&#xff0c;如操作系统、编译器、数据库等。在实际应用中&#xff0c;红黑树主要用于实现高效的查找和排序&#xff0c;如 Linux 内核中的进程调度和空闲内…

VRIK+Unity XR Interaction Toolkit 配置 VR 全身模型(下):实现腿部行走动画

在上一篇教程&#xff1a;VRIKUnity XR Interaction Toolkit 配置 VR 全身模型&#xff08;上&#xff09;&#xff1a;实现上半身的追踪&#xff08;附带VRM模型导入Unity方法和手腕扭曲的解决方法&#xff09;当中&#xff0c;我们通过配置VRIK Unity XR Interaction Toolki…

WiFi(Wireless Fidelity)基础(一)

目录 一、基本介绍&#xff08;Introduction&#xff09; 二、进化发展&#xff08;Evolution&#xff09; 三、PHY帧&#xff08;&#xff08;PHY Frame &#xff09; 四、MAC帧&#xff08;MAC Frame &#xff09; 五、协议&#xff08;Protocol&#xff09; 六、安全&#x…

小松鼠踩一踩游戏

文章目录 一、 介绍和知识点九、UnityFacade 门面设计模式二、 声音全局管理器测试音频代码UI全局管理器父类抽象类 BaseManager子类 UIManager 四、 UI按钮的引用父类 BasePanel子类主面板 MainPanel子类 游戏中 GamePanel子类 游戏结果 ResultPanel 角色动画器、控制角色移动…

性能测试如何做?一套完整的性能测试流程,“我“拒绝背锅...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、测试准备工作 …

中兴B860AV2.1-T(M)-高安版-当贝纯净桌面线刷固件包

中兴B860AV2.1-T(M)-高安版-当贝纯净桌面线刷固件包-内有教程及短接点 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件…

有序序列中插入一个整数

思路&#xff1a; 将输入的要插入的数m依次和数组中的元素进行比较。 思&#xff1a; 在排好序的数组中&#xff0c;从右往左比较还是从左往右比较&#xff1f; 其实都可以&#xff0c;但是我觉得从右边&#xff08;也就是最大的数&#xff09;依次开始比较&#xff0c;程序比较…

纯前端JS实现文件上传解析渲染页面

AI真的能代替前端吗&#xff1f; 回答&#xff1a;不会完全代替 能用吗&#xff1f;复制到项目中只会报错 爆红 ……他完全不能理解你需要什么JavaScript&#xff08;简称JS&#xff09;是一种轻量级的脚本语言&#xff0c;主要用于在Web页面上添加交互行为。它由三个不同的…

5月跳槽有风险,不跳也有?

今天讲讲跳槽。 说实话跳槽是为了寻求更好的发展&#xff0c;但在跳槽前我们也不能确定下家就是更好的归宿&#xff0c;这就更加需要我们审慎地去对待&#xff0c;不能盲目跳槽。 其次&#xff0c;我们离职和跳槽&#xff0c;其中的原因很大一部分是目前薪资不符合预期。 那…

基于python+opencv的人脸识别打卡(手把手教你)

基于pythonopencv的人脸识别打卡 1 创建环境2 准备工作2.1新建members.csv文件2.2新建face文件夹2.3注意事项 3 源码4 操作步骤 1 创建环境 conda create -n face python3.7 conda activate face pip install opencv-python pip install pillow pip install opencv-contrib-py…

基于Redis中zset实现延时任务

目录 概要 一、实现原理 适用场景 二、准备工作 三、代码实现 四、zset的优缺点 优点 缺点 概要 本文章主要记录的是使用Redis中的zset实现延时任务&#xff0c;在工作中&#xff0c;像这样的的延时任务是不可避免的&#xff0c;举个栗子&#xff1a;买一张火车票&#…

企业如何利用网络趋势做好线上营销?

随着互联网的不断发展&#xff0c;线上营销越来越成为企业营销的重要组成部分。如何利用网络趋势做好线上营销&#xff0c;已经成为各大企业关注的焦点。本文将为大家介绍如何利用网络趋势做好线上营销的方法和技巧。 一、了解网络趋势 了解网络趋势是做好线上营销的关键。网络…