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}")
            }
        }
    }

结果
在这里插入图片描述

相关推荐

  1. Reactjs组件

    2024-06-09 23:00:05       32 阅读
  2. HarmonyOS基础组件

    2024-06-09 23:00:05       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 23:00:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 23:00:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 23:00:05       87 阅读
  4. Python语言-面向对象

    2024-06-09 23:00:05       96 阅读

热门阅读

  1. 《Linux内核精通》笔记参考目录

    2024-06-09 23:00:05       19 阅读
  2. tengine+lua的镜像制作

    2024-06-09 23:00:05       30 阅读
  3. CSS:字数超出容器范围,超出部分省略,变成...

    2024-06-09 23:00:05       52 阅读
  4. #09 Stable Diffusion动画制作入门

    2024-06-09 23:00:05       34 阅读
  5. oracle开发中常用的sql语句

    2024-06-09 23:00:05       36 阅读
  6. autosar RTE模块功能介绍

    2024-06-09 23:00:05       43 阅读
  7. Rating Compression(单调栈,树状数组)

    2024-06-09 23:00:05       37 阅读
  8. React@16.x(23)useEffect

    2024-06-09 23:00:05       44 阅读
  9. Python进阶之-mmap详解

    2024-06-09 23:00:05       32 阅读