Android Jetpack Compose实现轮播图效果

这篇具有很好参考价值的文章主要介绍了Android Jetpack Compose实现轮播图效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Jetpack Compose实现轮播图效果

Android Jetpack Compose实现轮播图效果

在最近思索如何使用Compose方式改进我的开源TMDB电影列表应用程序的主屏幕时,一个激动人心的概念浮现在我的脑海中——为什么不整合一个吸引人的轮播图来展示即将上映的电影呢?在本文中,我将分享我的开发和实现自定义轮播图的经历,提供涉及不同步骤的见解。

首先,我搜索了现有的解决方案,考虑到Material Design 3文档中有一个轮播图组件的可用性。然而,我很快发现它尚未发布用于Jetpack Compose,而且仅在最新的MDC-Android(视图系统)Alpha版本中可访问。这迫使我决定开发自己的轮播图,利用HorizontalPager,这是一个Compose组件,允许水平滚动和页面变换。

为了有效地解决开发过程,我将问题分为四个不同的部分:

  1. HorizontalPager转换为实现所需的旋转木马效果。
  2. 加入指示器显示当前可见页面。
  3. HorizontalPager页面实现自动滚动。
  4. 利用动画增强即将出现的页面的外观,同时聚焦当前显示的页面并淡化其他页面。
    让我们逐个详细讨论这些部分。

将HorizontalPager转换为实现所需的旋转木马效果

为了创建所需的旋转木马效果,我们必须首先自定义HorizontalPager以部分显示前一个和后一个页面。
为此,HorizontalPager提供了两个参数:

  1. contentPadding:允许我们从每个轴应用边距,创建所需的页面周围间距。
  2. pageSpacing:在两个相邻页面之间引入间隙,确保视觉上吸引人的布局。

Android Jetpack Compose实现轮播图效果

HorizontalPager(
    contentPadding = PaddingValues(horizontal = 32.dp),
    pageSpacing = 16.dp
) { page ->
    ...
    CarouselItem(item)
}

将指示器合并到页面中以显示当前可见页面

这个任务很容易完成。我只需要将HorizontalPager置于Box布局中,并将DotIndicators合成到Box底部对齐即可。

Box {
    HorizontalPager(pageCount = pageCount, state = pagerState) { page ->
        CarouselItem(itemList[page])
    }

    DotIndicators(
        pageCount = pageCount,
        pagerState = pagerState,
        modifier = Modifier.align(Alignment.BottomCenter)
    )
}

我们创建了一个名为DotIndicators的可组合组件。它需要两个参数:页数(pageCount)和页面状态(pageState)。我们使用页数(pageCount)添加相同数量的指示器,而使用页面状态(pageState)使选定的点显示更暗。内部实现如下:

@Composable
fun DotIndicators(
    ...,
    modifier: Modifier
) {
    Row(modifier = modifier) {
        repeat(pageCount) { iteration ->
            val color = if (pagerState.currentPage == iteration) selectedColor else unselectedColor
            Box(
                modifier = Modifier
                    .clip(CircleShape)
                    .background(color)
            )
        }
    }
}

上面指示器效果如下:
Android Jetpack Compose实现轮播图效果

为HorizontalPager页面实现自动滚动

目前,我们的设置要求用户手动水平滑动以导航到下一页。为了增强用户体验,我们可以实现自动滚动。我们通过利用HorizontalPager提供的Coroutine、LaunchedEffect和PagerState来实现这一点。
以下是一个完全具备功能的示例实现:

@Composable
fun AwesomeCarousel(
    pageCount: Int = 10,
    pagerState: PagerState = rememberPagerState(),
    autoScrollDuration: Long = 3000L
) {
    val isDragged by pagerState.interactionSource.collectIsDraggedAsState()
    if (isDragged.not()) {
        with(pagerState) {
            var currentPageKey by remember { mutableStateOf(0) }
            LaunchedEffect(key1 = currentPageKey) {
                launch {
                    delay(timeMillis = autoScrollDuration)
                    val nextPage = (currentPage + 1).mod(pageCount)
                    animateScrollToPage(page = nextPage)
                    currentPageKey = nextPage
                }
            }
        }
    }

    HorizontalPager(pageCount = pageCount, state = pagerState) { page ->
        CarouselItem(itemList[page])
    }
}

代码片段中的主要要点是:

  1. LaunchedEffectLaunchedEffect 是 Jetpack Compose 提供的一种特殊效果,允许我们在协程中执行副作用,当特定键值发生改变时触发。在这种情况下,key1 参数设置为 currentPageKey,这意味着只要 currentPageKey 的值发生更改,该效果就会被触发。在LaunchedEffect块内,我们使用 launch 函数启动一个新的协程。这个协程在合成过程中异步执行并且独立于合成进程。

  2. delay(timeMillis = autoScrollDuration):这一行引入了一个延迟,协程会在 autoScrollDuration 变量指定的持续时间内暂停,然后继续执行下一行代码。在暂停后,我们再次更改键,这导致协程重新启动,因此这意味着 LaunchedEffect 内部的块将无限次地执行。

  3. isDragged.not():此代码段确保仅在不拖动页面时执行后续操作。它控制自动滚动行为,避免了用户交互和自动滚动过程之间的冲突。例如,如果用户正在滑动页面,自动滚动将停止。

利用动画增强页面外观

实现的最后一部分着重于增强轮播页面的视觉过渡效果。通过利用graphicLayer修饰器,我们可以实现平滑无缝的过渡效果。关键动画包括在淡出旧项的同时淡入新项,以及在项接近或远离中心时进行缩放。

以下代码计算当前页面和目标页面之间的偏移量,然后使用此偏移量在0.7和1之间插值出一个转换值。然后将此转换值应用于graphicLayeralphascaleY属性。

fun Modifier.carouselTransition(page: Int, pagerState: PagerState) =
    graphicsLayer {
        val pageOffset =
            ((pagerState.currentPage - page) + pagerState.currentPageOffsetFraction).absoluteValue

        val transformation =
            lerp(
                start = 0.7f,
                stop = 1f,
                fraction = 1f - pageOffset.coerceIn(0f, 1f)
            )
        alpha = transformation
        scaleY = transformation
    }
  1. 我们计算了在页面分页器中当前页面和目标页面之间的偏移量。它考虑了整个页面差异(pagerState.currentPage-page)和分数(pagerState.currentPageOffsetFraction),后者表示在页面之间转换的进度。绝对值确保偏移量始终为正数。
  2. lerp函数用于基于分数在起始点和结束点之间插值计算一个值。在这种情况下,起始值为0.7f,停止值为1f,而分数则被计算为1f - pageOffset.coerceIn(0f, 1f)。coerceIn函数可以确保分数保持在0到1的范围内。
  3. alpha = transformationtransformation的值分配给了graphicLayeralpha属性。将alpha设置为介于0和1之间的值可以确定图层的透明度。值为1表示图层完全不透明,而值为0表示它完全透明。
  4. scaleY = transformation同样,这行将transformation的值分配给了graphicLayerscaleY属性。调整scaleY属性会垂直缩放图层。值为1表示图层的原始大小,而小于1的值会减少垂直比例,大于1的值会增加垂直比例。
    我们在HorizontalPageritem modifier上利用graphicLayer扩展函数。这使我们可以对每个旋转木马项目应用变换并创建效果。
HorizontalPager() { page ->
    val page = list[page]
    CarouselItem(
        item = page,
        modifier = Modifier.carouselTransition(page, pagerState)
    )
}

Android Jetpack Compose实现轮播图效果

github地址

https://github.com/TheSomeshKumar/Flixplorer文章来源地址https://www.toymoban.com/news/detail-475314.html

到了这里,关于Android Jetpack Compose实现轮播图效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app小程序折叠3D轮播图效果实现。

    先来看效果图 实现原理: 通过小程序的触摸事件,来控制图片数组的变化实现动态样式;来改变图片的样式。 贴上轮播组件完整代码 组件使用 如果有自动轮播的需求,可以改造下组件加个定时器处理数组就OK了。

    2024年02月11日
    浏览(44)
  • vue 实现钉钉官网的轮播图下面功能滚动排版CSS效果

    前言 最近在写PC端的业主端时候,发现传统的菜单栏比较丑,也不符合实际应用(功能页面并不多-展示为主) 偶然发现钉钉官网的效果挺有意思的,想着把这个效果复原过来,然后夸夸搜索了一番。 经过一顿的cv打法,加上修修补补把大概的效果整了出来,时间关系最基础

    2024年02月11日
    浏览(55)
  • 微信小程序中实现轮播图效果

    swiper是轮播图的外层容器,所以使用轮播图就必须使用到swiper标签。 存在默认样式: 1 width 100% 2 height 150px 只能放置在swiper组件中。表示每一个轮播项。 编译效果: 当切换机型后,就可以方向,图片的宽高与效果不一样 1.分析和升级版本,解决换机型的宽高问题 ①先找出

    2024年02月11日
    浏览(57)
  • 前端效果积累 |别具一格的3D酷炫轮播图效果收集

    📌 个人主页 :个人主页 ​🧀 推荐专栏 :前端开发成神之路 --【 这是一个为想要 入门和进阶前端开发专门开启的精品专栏 !从 个人到商业的全套开发教程 ,实打实的干货分享,确定不来看看? 😻😻】 📝 作者简介 : 从web开发,再到大数据算法,踩过了无数的坑,用

    2024年02月16日
    浏览(40)
  • 前端Vue自定义轮播图视频播放组件 仿京东商品详情轮播图视频Video播放效果 可图片预览

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月15日
    浏览(53)
  • 微信小程序首页、界面布局、3D轮播图效果(示例二)

    使用swiper实现3D轮播图效果,自定义顶部状态栏,具体代码: 1、js代码 2、wxml代码 3、wxss代码 4、json代码 如需要下载完整版,包含监听事件、图片文件等,请前往下方链接,下载完整版,下载后直接使用微信开发者工具打开即可,下载链接为: 小程序完整版界面(示例二)

    2024年02月10日
    浏览(58)
  • Android Jetpack Compose之底部导航栏的实现

    写过一段Android jetpack compose 界面的小伙伴应该都用过Compose的脚手架 Scaffold ,利用它我们可以很快的实现一个现代APP的主流界面架构,即一个带顶部导航栏和底部导航栏的界面架构,我们基于这个架构可以快速的搭建出我们想要的页面效果。而今天的文章就是要介绍如何实现

    2024年03月23日
    浏览(52)
  • Android---Banner轮播图

    轮播图是一种很常见的UI。 Banner框架 能够帮助我们快速开发,完成首页轮播图效果的需求。 1、导入Banner依赖 2、activity_main.xml布局。 banner_loop_time: 设置轮播间隔时间,默认3000;banner_radius: 设置轮播图的圆角   3、设置Banner 适配器 。 实现一个简单的轮播图效果,Banner框架已

    2024年02月01日
    浏览(43)
  • 【案例分享 | 旅游出行app】Axure制作banner轮播图交互效果

    哈喽,大家好!今天给大家介绍如何使用Axure软件制作banner轮播图的交互效果。 【预览地址含下载】电脑打开链接:https://wh9x1s.axshare.com/ 【完整案例作品预览含下载】:https://fx2z9z.axshare.com 【视频教程】:哔哩哔哩视频 首先,让我们来看下效果展示:进入页面后自动轮播图

    2024年02月19日
    浏览(55)
  • 制作轮播图经验分享——element ui走马灯的使用(附源码,效果截图)

    先附上效果图:   element ui链接地址:Carousel 走马灯 | Element Plus (gitee.io) 源码: 这里我使用的是静态图片(本地) 经验分享: 在制作轮播图的时候经常会发现图片大小不一,这时候可以在img标签里加上width:100%;height:100%即可实现图片铺满。 当然,这只是轮播图的一种,还

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包