使用 Jetpack Compose 实现 ViewPager2

news/2024/11/7 18:31:34/

在此博客中,我们将介绍如何在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.ppmy.cn/news/665829.html

相关文章

动态二维码生成器PHP Dynamic QRcode

什么是 PHP Dynamic QRcode &#xff1f; PHP Dynamic QRcode 是一个允许生成和保存动态和静态二维码&#xff08;QR码&#xff09;的应用。它具有简洁、响应灵敏且用户友好的设计。其中包含您网站中可能需要的一般功能&#xff0c;如&#xff1a;记录管理&#xff08;CRUD&…

K4汽车保养

2017.12 换防冻液 2018.05 换变速箱油、刹车油、动力转向油 2.5W公里换的火花塞 2020.06 换菲罗多刹车油、采埃孚动力转向油、百适通防冻液 2020.06 换蓄电池 2020年 下半年保养考虑换前刹车片&#xff08;未保养&#xff09; 2022.6 采埃孚动力转向油、百适通防冻液&#x…

代替紧急通知_紧急通知!事关你的爱车!这件事12月21日前必须办!

叮叮叮~ 马上就要冬至啦&#xff01; 你爱车的防冻液还没换吗&#xff1f; 说到冬季汽车养护&#xff0c;防冻液是必不可少的项目。 尤其是北方地区&#xff0c;气候寒冷。 防冻液可以防止停车时冷却液结冰而胀裂散热器 和冻坏发动机气缸体。 更换防冻液时就会发现&#xff0c;…

PHP 的 Logo 为什么是大象?

因为大象是世界上最好的动物。 当然&#xff0c;这只是开玩笑&#xff0c;那么为什么PHP的LOGO是大象呢&#xff1f;还有哪些关于PHP的LOGO的有趣的事情呢&#xff1f; 吉祥物-大象 ElePHPant 是一款可爱的 PHP 吉祥物&#xff0c;其设计中有一头大象。 最初的LOGO 1998 年…

Debian 12 “bookworm” 正式发布

经过 1 年 9 个月零 28 天的开发&#xff0c;Debian 项目推出了其新的稳定版本 12&#xff08;代号 bookworm&#xff09;。 Debian 12 包含超过 11,089 个新软件包&#xff0c;总计 64,419 个软件包&#xff0c; 6,296 个软件包已作为过时包删除。此版本更新了 43,254 个软件…

770天后,微博大变

770天后&#xff0c;微博大变&#xff08;转&#xff09; 10月14日下午&#xff0c;新浪微博&#xff0c;不&#xff0c;应该是“微博”终于发布了 PC 端的第六个版本 V6&#xff0c;这据他发布的上一个版本 V5 已经悄悄过去 770 天了。在这 770 天里&#xff0c;微博几乎经历了…

React Native入门(六)之列表组件的使用(1)

前言 这篇文章来了解一下相关列表组件的使用&#xff0c;这些组件在展示数据的时候比较有用&#xff01;在Android中有ScrollView&#xff0c;ListView等&#xff01;那么对应的RN中也有类似的组件&#xff01; ScrollView 没错&#xff0c;在RN中也有ScrollView这个滚动视图…

一小时入门 Python 3 网络爬虫-转载

一、前言 强烈建议&#xff1a;请在电脑的陪同下&#xff0c;阅读本文。本文以实战为主&#xff0c;阅读过程如稍有不适&#xff0c;还望多加练习。 本文的实战内容有&#xff1a; 网络小说下载&#xff08;静态网站&#xff09; 优美壁纸下载&#xff08;动态网站&#xf…