使用 Jetpack Compose 实现 ViewPager2

在此博客中,我们将介绍如何在Jetpack Compose中实现ViewPager2的功能。我们将使用Accompanist库中的Pager库,这是由Google开发的一个用于Jetpack Compose的库。

首先,需要将Pager库添加到你的项目中:

implementation 'androidx.compose.foundation:foundation:1.4.1'

 

创建Pager

然后,我们创建一个Pager:

案例1

@OptIn(ExperimentalFoundationApi::class)
@Preview
@Composable
fun HorizontalPagerSimpleExample1(){val pagerState1 =rememberPagerState();HorizontalPager(pageCount = 5, state = pagerState1) {Box(modifier = Modifier.fillMaxSize().background(Color.Green), contentAlignment = Alignment.Center){Text(text = "页面:$it")}}
}

案例2: 带下一个和上一个按钮的水平寻呼机(手动滚动)

在下一个示例中,我们将添加“下一个”和“上一个”按钮以显示 的用法rememberPagerState,您可以使用它们手动滚动到特定页面,如下例所示

@OptIn(ExperimentalFoundationApi::class)
@Preview
@Composable
fun HorizontalPagerWithNextPrevButtonExample(){val pagerState = rememberPagerState()val coroutineScope = rememberCoroutineScope()Box(modifier = Modifier.fillMaxWidth().height(300.dp)){HorizontalPager(pageCount = 5, state = pagerState) { pagerIndex->Box(modifier = Modifier.fillMaxSize().background(Color.Green), contentAlignment = Alignment.Center){Text(text = "页面索引$pagerIndex")}}Row(modifier = Modifier.align(Alignment.BottomCenter).padding(bottom = 16.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)){val preButtonVisible = remember{derivedStateOf{pagerState.currentPage>0}}val nextButtonVisible= remember {derivedStateOf {pagerState.currentPage<4}}Button(enabled = preButtonVisible.value,onClick = {val prevPageIndex = pagerState.currentPage-1coroutineScope.launch { pagerState.animateScrollToPage(prevPageIndex) }}) {Text(text = "Prev")}Button(enabled = nextButtonVisible.value, onClick = {val nextPageIndex= pagerState.currentPage+1coroutineScope.launch { pagerState.animateScrollToPage(nextPageIndex) }}) {Text(text = "next")}}}
}

我们用来在上面Box放置Next和按钮PrevHorizontalPager

derivedStateOfApi 用于确定何时启用NextPrev按钮。derivedStateOf在这里是一个理想的选择,因为我们不想每次页面索引更改时都重新组合按钮,以避免不必要的重新组合。

案例3:具有图像和点指示器的水平页面

  在下一个示例中,我们希望显示内部图像HorizontalPager,并在底部显示点指示器。对于点指    示器,我们将使用accompanistHorizontalPagerIndicator的 Api 。Api 仍然没有移至官方的        compose 依赖项,这就是为什么我们必须使用accompanist并且它与Jetpack compose 基础依      赖项兼容。HorizontalPagerIndicatorHorizontalPager

添加以下依赖项,请参阅accompanistHorizontalPagerIndicator的 github 存储库的 Readme 部分中的兼容版本。

implementation "com.google.accompanist:accompanist-pager-indicators:0.30.1"

 

@OptIn(ExperimentalFoundationApi::class)
@Composable
fun HorizontalPagerWithIndicators(images: List<Int>) {val pagerState= rememberPagerState()Box(modifier = Modifier.fillMaxWidth().height(300.dp)){HorizontalPager(pageCount = 5, state = pagerState) {Image(painter = painterResource(id = images[it]),contentScale = ContentScale.Crop,modifier = Modifier.fillMaxWidth(),contentDescription = "")}HorizontalPagerIndicator(modifier=Modifier.align(Alignment.BottomCenter).padding(bottom = 10.dp),pageCount = 5,pagerState=pagerState,)}
}

HorizontalPagerIndicator可组合性正在采取pageCountpagerState

pageCount必须与我们传递的相同,其中HorizontalPager 也采用通过创建的pagerState相同引用传递,因此两者和必须将相同的寻呼机状态传递给它们以便彼此同步。HorizontalPagerrememberPagerState() 和HorizontalPagerHorizontalPagerIndicator

HorizontalPager每页显示一个图像,正在使用当前页面的索引从图像列表中访问该图像。

Box用于覆盖HorizontalPagerIndicator在上面HorizontalPager

案例4:带图像的垂直页面

HorizontalPager我们在上面的故事中看到了一些例子。现在让我们看看VerticalPager.我们将使用图像列表来显示VerticalPager。下面的代码。

@Preview
@Composable
fun VerticalPagerWithImagesAndIndicatorsScreen() {val images = listOf(R.mipmap.img1,R.mipmap.img2,R.mipmap.img3,R.mipmap.img4,R.mipmap.img1,)Column {VerticalPagerWithImagesAndIndicators(images)}
}@OptIn(ExperimentalFoundationApi::class)
@Composable
fun VerticalPagerWithImagesAndIndicators(images: List<Int>) {val pagerState = rememberPagerState()VerticalPager(pageCount = 5,pageSize = PageSize.Fixed(300.dp),pageSpacing = 8.dp,state = pagerState) {Image(modifier=Modifier.fillMaxSize(),painter = painterResource(id = images[it]),contentDescription = "",contentScale = ContentScale.Crop)}}

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter远程服务模式运行时引用csv文件的路径配置

目录 前言&#xff1a; 问题 解决方法 前言&#xff1a; 在JMeter远程服务模式下运行时&#xff0c;你可以通过配置CSV文件的路径来引用该文件。CSV文件经常用于存储测试数据&#xff0c;可以在测试中进行参数化。 问题 在使用jmeter过程中&#xff0c;本机的内存等配置不…

【Linux】程序员的基本素养学习

这是目录 写在前面一、内存管理1、分段2、分页 二、线程管理三、静态库1、编译1.1、预处理1.2、编译1.3、汇编1.4、链接2、编译器3、目标文件**.text****.data****.bss****__attribute__** 3.1、符号3.2、兼容C语言 -- extern C4、链接 -- ld 写在前面 本文记录自己的学习生涯…

微服务架构之网关详解

前言 由于互联网的高速发展&#xff0c;网络数据请求数激增&#xff0c;使得服务器承受的压力越来越大。在早期的系统架构中&#xff0c;为减轻单台服务器的压力&#xff0c;通常使用 Load Balancer 来将网络流量平摊到多个服务器中。如今后端服务的种类和数量在不断变多&…

Linux--获取文件相关的各种时间:stat

stat是state英文的简写 语法&#xff1a; stat 文件名 功能&#xff1a; 获取文件的access&#xff08;访问时间&#xff09;、modify&#xff08;修改时间&#xff09;、change&#xff08;更改时间&#xff09; 文件的access时间&#xff08;访问时间&#xff09;指的是最…

npm报错(npm ERR! Unexpected token ‘.‘)

使用 nvm 将 node 切换到高版本后&#xff0c;运行 npm 相关的命令报的这个错 解决办法&#xff1a; 1、通过nvm list 命令查看当前都安装的node版本列表&#xff0c;依次通过 nvm uninstall [version] 命令将已经安装的 node 版本依次删除。 [version] 代表 node 版本号。 2…

音视频BUG学习

找Bug流程 1、首先看出现概率是偶现还是必现 2、如果是必现&#xff0c;则复现整个bug过程&#xff0c;看Bug是否出现 如果是偶现&#xff0c;则分析问题视频 问题一 【欧立】【远程抓拍】安卓-远程抓拍的视频&#xff0c;下载到手机本地相册&#xff0c;声音慢放 一、额外知…

Android逆向解析加壳与脱壳技术

加壳 加壳是指在 APK 文件中插入额外的代码或数据&#xff0c;使得原始代码难以被分析和反编译。通常加壳是为了保护软件的知识产权或者防止逆向工程。下面是 Android 加壳的一般流程&#xff1a; 选择加壳工具&#xff1a;选择合适的加壳工具进行加壳&#xff0c;比如市面上…

[计算机入门]了解键盘

2.1 了解键盘 键盘一般可以根据按键的功能进行分区&#xff0c;一般分为&#xff1a;主键盘区、小键盘区、控制键区、功能键区、指示灯区。下面介绍键盘的各个分区按键及功能。 2.1.1 主键盘区 主键盘区又叫打字键盘区或字符键区&#xff0c;具有标准英文打字机键盘的格式。…

基于Dlib的疲劳检测系统

需要源码的朋友可以私信我 基于Dlib的疲劳检测系统 1、设计背景及要求2、系统分析3、系统设计3.1功能结构图3.2基于EAR、MAR和HPE算法的疲劳检测3.2.1基于EAR算法的眨眼检测3.2.2基于MAR算法的哈欠检测3.3.3基于HPE算法的点头检测 4、系统实现与调试4.1初步实现4.2具体实现过程…

用雪花 id 和 uuid 还是自增id做 MySQL 主键

MySQL中设计表的时候&#xff0c;MySQL官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一)&#xff0c;而是推荐连续自增的主键id&#xff0c;官方的推荐是auto_increment&#xff0c;那么为什么不建议采用uuid&#xff0c;使用uuid究竟有什么坏处&#xff1f; MySQ…

3.跑马灯

1.GPIO的输出模式&#xff1a; 推挽模式输出&#xff1a;因为LED0和LED1阳极都是3.3V&#xff0c;需要将阴极设置为低电平才可以点亮LED&#xff1b;操作io口时&#xff0c;必须引入源文件和头文件&#xff1b;关于时钟的文件存放在rcc中&#xff1b; 2.GPIO库函数介绍&#…

NodeJS NVM版本管理⑩⑧

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言NVM IntroduceNVM UseDownload And InstallNVM Project Use总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹…