当前位置: 首页 > news >正文

Android Compose 十:常用组件列表 监听

1 去掉超出滑动区域时的拖拽的阴影

即 overScrollMode
在这里插入图片描述
代码如下

 CompositionLocalProvider(LocalOverscrollConfiguration provides null) {LazyColumn() {items(list, key = {list.indexOf(it)}){Row(Modifier.animateItemPlacement(tween(durationMillis = 250))) {Text(text = "条目>>${it}")}}}}

效果

在这里插入图片描述
如果你都不需要这个效果,可以在MyApplicationTheme的content里 包一层CompositionLocalProvider
MyApplicationTheme
在这里插入图片描述

  • CompositionLocalProvider
    CompositionLocal 是定义数据的方式,而 CompositionLocalProvider 是在 Compose UI 树中传递这些数据的工具。更多自行百度吧

2 滑动监听

2.1 state的监听
  val lazyListState = rememberLazyListState()LazyColumn(state = lazyListState) {items(list, key = { list.indexOf(it) }) {Row(Modifier.animateItemPlacement(tween(durationMillis = 250))) {Text(text = "条目>>${it}")}}}

官方文档有以下描述
在这里插入图片描述
大意就是,我们需要监听滑动的状态,用于不同的处理
那么我们之前使用recyclerview的时候,可以通过LayoutManager监听滑动,并且可以获取到当前显示的第一条条目和最后一条条目;
然后就可以判断是否上拉加载更多,或者下拉刷新
此处我们改吧改吧

LaunchedEffect(lazyListState) {snapshotFlow { lazyListState.isScrollInProgress }   //监听是否在滑动.collect {Log.i("bl_test","it>>${it}")Log.i("bl_test"," lazyListState.firstVisibleItemIndex>>${ lazyListState.firstVisibleItemIndex}")}}

当我们滑动开始和停止的时候打印如下日志

2024-06-06 11:51:49.816 20115-20115/com.zqq.myapplication I/bl_test: it>>true
2024-06-06 11:51:49.816 20115-20115/com.zqq.myapplication I/bl_test:  lazyListState.firstVisibleItemIndex>>0
2024-06-06 11:51:52.091 20115-20115/com.zqq.myapplication I/bl_test: it>>false
2024-06-06 11:51:52.091 20115-20115/com.zqq.myapplication I/bl_test:  lazyListState.firstVisibleItemIndex>>6

这里暂时不知如何判断 条目完全显示的情况,LayoutManager是有这个方法的;
方案就是 lazyListState 可以获取到第一条目的偏移量 可以通过此来判断;

  • 更多的监听 前面写过interactions 状态监听
  LaunchedEffect(lazyListState){lazyListState.interactionSource.interactions.collect{Log.i("bl_test","it>>${it}")Log.i("bl_test","it>>${it.javaClass}")Log.i("bl_test","it>>${it is DragInteraction}")Log.i("bl_test","it>>${it is DragInteraction.Start}")Log.i("bl_test","it>>${it is DragInteraction.Stop}")Log.i("bl_test","it>>${it is DragInteraction.Cancel}")if(it is DragInteraction.Stop){  //滑动结束 获取第一条显示的条目Log.i("bl_test"," lazyListState.firstVisibleItemIndex>>${ lazyListState.firstVisibleItemIndex}")Log.i("bl_test"," lazyListState.firstVisibleItemScrollOffset>>${ lazyListState.firstVisibleItemScrollOffset}")}}}

结果
在这里插入图片描述

  • Modifier.scrollable
 val scrollableState = rememberScrollableState(){Log.i("bl_test","it>>"+it)it}LazyColumn(state = lazyListState,modifier = Modifier.scrollable(state = scrollableState,orientation = Orientation.Vertical)) {items(list, key = { list.indexOf(it) }) {Row(Modifier.animateItemPlacement(tween(durationMillis = 250))) {Text(text = "条目>>${it}")}}}

rememberScrollableState 的 翻译
在这里插入图片描述
打印日志 效果

  • 当未滑动到顶部或者底部时 回调it值一直为0

  • 滑动到顶部继续拖拽时 值 大于0

  • 滑动到底部时 值 小于0

  • 惯性滑动到顶部时 值 大于0 后 递减
    在这里插入图片描述
    …(此处省略大部分值)
    在这里插入图片描述

  • 惯性滑动到顶部时 值 小于0 递增
    在这里插入图片描述
    …(此处省略大部分值)
    在这里插入图片描述

依据此值应该可以判断出 滑动到了底部或者顶部

  • Modifier .verticalScroll()
    报错了
    在这里插入图片描述

  • Modifier .nestedScroll 监听滑动状态

 val nestedConnection  = remember {object : NestedScrollConnection{override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity {Log.i("bl_test","onPostFling")return super.onPostFling(consumed, available)}override fun onPostScroll(consumed: Offset,available: Offset,source: NestedScrollSource): Offset {Log.i("bl_test","onPostScroll")return super.onPostScroll(consumed, available, source)}override suspend fun onPreFling(available: Velocity): Velocity {Log.i("bl_test","onPreFling")return super.onPreFling(available)}override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {Log.i("bl_test","onPreScroll")return super.onPreScroll(available, source)}}}LazyColumn(state = lazyListState,modifier = Modifier.nestedScroll(connection = nestedConnection)) {items(list, key = { list.indexOf(it) }) {Row(Modifier.animateItemPlacement(tween(durationMillis = 250))) {Text(text = "条目>>${it}")}}}

结果
在这里插入图片描述

http://www.lryc.cn/news/364832.html

相关文章:

  • Wireshark 如何查找包含特定数据的数据帧
  • 【深度学习入门篇一】阿里云服务器(不需要配环境直接上手跟学代码)
  • app,waf笔记
  • 数据仓库之维度建模
  • 解决远程服务器连接报错
  • 通过电脑查看Wi-Fi密码的方法,提供三种方式
  • Nvidia 目前的市值为 3.01 万亿美元,超过苹果Apple
  • 用langchain搭配最新模型ollama打造属于自己的gpt
  • 工业互联网基本概念及关键技术(295页PPT)
  • Python pandas openpyxl excel合并单元格,设置边框,背景色
  • 【vue3|第7期】 toRefs 与 toRef 的深入剖析
  • git代码冲突处理软件P4Merge
  • Unity物体材质属性Offset动态偏移
  • 【数据结构】筛选法建堆
  • DevExpress Installed
  • 解决QT QMessageBox 弹出需点击两次才能关闭问题
  • Milvus--向量数据库
  • php质量工具系列之PHPCPD
  • Android14 WMS-窗口绘制之relayoutWindow流程(二)-Server端
  • 安全测试 之 安全漏洞:SQL注入
  • CUDA和驱动版本之间的对应关系
  • MDK(μVsion3)问题总结及解决方法
  • 手眼标定学习笔记
  • Dell戴尔XPS 16 9640 Intel酷睿Ultra9处理器笔记本电脑原装出厂Windows11系统包,恢复原厂开箱状态oem预装系统
  • 【第8章】SpringBoot实战篇之文章分类(上)
  • 【QT】Qt Plugin开发
  • 快速了解GPU分布通信技术:PCIe、NVLink与NVSwitch
  • Python对获取数据的举例说明
  • JVMの垃圾回收
  • 人工智能就业方向有哪些?