• Compose 组件 - 分页器 HorizontalPager、VerticalPager


    一、概念

    类似于 ViewPager,1.4 版本之前需要借助 accompanis 库,底层基于 LazyColumn、LazyRow 实现,在使用上也基本相同。默认情况下 HorizontalPager 占据屏幕的整个宽度,VerticalPager 会占据整个高度。

    1. fun HorizontalPager(
    2. pageCount: Int, //页面数量
    3. modifier: Modifier = Modifier,
    4. state: PagerState = rememberPagerState(), //控制监听页面状态的对象
    5. contentPadding: PaddingValues = PaddingValues(0.dp), //内容内边距
    6. pageSize: PageSize = PageSize.Fill, //页面填充模式(填充满Fill,自适应Fixed)
    7. beyondBoundsPageCount: Int = 0, //当前页面前后预加载的页面数量
    8. pageSpacing: Dp = 0.dp, //两个页面之间的间隙
    9. verticalAlignment: Alignment.Vertical = Alignment.CenterVertically,
    10. flingBehavior: SnapFlingBehavior = PagerDefaults.flingBehavior(state = state), //用于滚动后手势的flingBehavior
    11. userScrollEnabled: Boolean = true, //是否允许通过用户手势或辅助功能进行滚动(即使禁用PagerState.scroll,您仍然可以使用它以编程方式滚动)
    12. reverseLayout: Boolean = false, //反转页面顺序
    13. key: ((index: Int) -> Any)? = null, //表示项目的稳定且唯一的密钥。当您指定键时,滚动位置将根据键保持,这意味着如果您在当前可见项目之前添加/删除项目,则具有给定键的项目将保留为第一个可见项目。
    14. pageNestedScrollConnection: NestedScrollConnection = PagerDefaults.pageNestedScrollConnection(
    15. Orientation.Horizontal
    16. ), //一个嵌套的ScrollConnection,用于指示此Pager如何使用嵌套列表。默认行为将使Pager消耗所有嵌套的delta。
    17. pageContent: @Composable (page: Int) -> Unit
    18. )

    二、使用

    2.1 简单使用

    1. HorizontalPager(
    2. pageCount = 10,
    3. modifier = Modifier.size(100.dp)
    4. ) { page ->
    5. // 每一页的内容,比如显示个文本
    6. Text(
    7. text = "Page: $page",
    8. modifier = Modifier.fillMaxSize()
    9. )
    10. }

    2.2 离屏加载更多页面

    将 beyondBoundsPageCount 属性设为 >0 的整数,会在当前页面左右各加载相同数量的页面。

    2.3 控制页面滚动

    使用 rememberPagerState() 创建一个 PagerState 对象,并将其作为 state 参数传递给分页器。在 CoroutineScope 中对此状态调用 PagerState.scrollToPage(),带动画跳转使用 PagerState.animateScrollToPage()。

    1. val pagerState = rememberPagerState( 10 ) //10是页面数量
    2. HorizontalPager(
    3. state = pagerState,
    4. modifier = Modifier.size(100.dp)
    5. ) { page ->
    6. Text(
    7. text = "Page: $page"
    8. modifier = Modifier.fillMaxSize()
    9. )
    10. }
    11. val coroutineScope = rememberCoroutineScope()
    12. Button(
    13. modifier = Modifier.align(Alignment.BottomCenter),
    14. onClick = {
    15. coroutineScope.launch {
    16. pagerState.scrollToPage(5)
    17. // pagerState.animateScrollToPage(5) //带动画跳转
    18. }
    19. }
    20. ) {
    21. Text("跳到页面5")
    22. }

    2.4 添加页面指示器

    2.4.1 小圆点

    通过 pagerState.pageCount 获取页面数量,并绘制自定义指示器。使用 pagerState.currentPage 获取当前显示页面的索引,改变对应指示器的颜色。

    1. Row(
    2. modifier = Modifier
    3. .align(Alignment.BottomCenter)
    4. .fillMaxWidth()
    5. .padding(bottom = 2.dp),
    6. horizontalArrangement = Arrangement.Center
    7. ) {
    8. repeat(pagerState.pageCount) { index ->
    9. val color = if (pagerState.currentPage == index) Colors.black else Colors.gray
    10. Box(modifier = Modifier
    11. .padding(2.dp)
    12. .clip(CircleShape)
    13. .background(color)
    14. .size(10.dp)
    15. )
    16. }
    17. }

    2.4.2 Tab栏

    1. @Composable
    2. fun Demo() {
    3. val tabList = listOf("最新","广场","问答","项目")
    4. val pagerState = rememberPagerState { tabList.size }
    5. val coroutineScope = rememberCoroutineScope()
    6. Column(
    7. modifier = Modifier.fillMaxSize()
    8. ) {
    9. TabRow(
    10. modifier = Modifier
    11. .padding(vertical = 10.dp)
    12. .fillMaxWidth()
    13. .height(20.dp),
    14. selectedTabIndex = pagerState.currentPage,
    15. containerColor = AppColors.transparent,
    16. indicator = {},
    17. divider = {}
    18. ) {
    19. tabList.forEachIndexed { index, title ->
    20. Tab(
    21. text = { Text(
    22. text = title,
    23. fontSize = if (pagerState.currentPage == index) 15.sp else 15.sp,
    24. fontWeight = if (pagerState.currentPage == index) FontWeight.ExtraBold else FontWeight.Bold) },
    25. selected = pagerState.currentPage == index,
    26. selectedContentColor = AppTheme.colors.textPrimary,
    27. unselectedContentColor = AppTheme.colors.textSecondary,
    28. onClick = { coroutineScope.launch { pagerState.scrollToPage(index) } }
    29. )
    30. }
    31. }
    32. HorizontalPager(
    33. state = pagerState,
    34. beyondBoundsPageCount = 1,
    35. pageSpacing = Dimension.contentMargin
    36. ) { index ->
    37. when (index) {
    38. 0 -> { NewestPage() }
    39. 1 -> { SquarePage() }
    40. 2 -> { QaPage() }
    41. 3 -> { ProjectPage() }
    42. }
    43. }
    44. }
    45. }

  • 相关阅读:
    MySQL高级SQL语句
    基于51单片机温度监控Proteus仿真设计_报警值可调
    vue3+vuex4
    小程序中如何设置所服务地区的时区
    虾皮选品免费工具:如何用知虾进行虾皮市场分析选品
    Python笔记,面向对象(11)遍历操作与描述器
    Redis整理复习
    SpringBoot @InitBinder注解绑定请求参数
    Pytorch实用教程:torch.from_numpy(X_train)和torch.from_numpy(X_train).float()的区别
    采用大语言模型进行查询重写——Query Rewriting via Large Language Models
  • 原文地址:https://blog.csdn.net/HugMua/article/details/133833760