快捷搜索: 王者荣耀 脱发

Compose中的“ViewPager“和Banner

前言

Compose库中是没有原生的类似ViewPager和Banner的控件的,虽然google官方有出"ViewPager",但目前还是测试版本:

implementation "com.google.accompanist:accompanist-pager:0.24.2-alpha"

于是我们来自己实现一个"ViewPager"(ComposePager)和Banner

正文

ComposePager

先看看ComposePager实现的效果:

代码也很简单:

看一下api:

/**
 * 类似于xml中的ViewPager
 * [pageCount]一共有多少页
 * [modifier]修饰
 * [composePagerState]ComposePager的状态
 * [orientation]滑动的方向
 * [userEnable]用户是否可以滑动,等于false时用户滑动无反应,但代码可以执行翻页
 * [content]compose内容区域
 */
@Composable
fun ComposePager(
    pageCount: Int,
    modifier: Modifier = Modifier,
    composePagerState: ComposePagerState = rememberComposePagerState(),
    orientation: Orientation = Orientation.Horizontal,
    userEnable: Boolean = true,
    content: @Composable ComposePagerScope.() -> Unit
)

其中composePagerState就是ComposePager中的状态,如果不需要监听或修改内部状态,则使用默认的即可

原理:

参考了RecyclerView和ViewPager,相当于一直有三个View,第一个View放在上(左)面,第二个View在中间展示,第三个View放在下(右)面,滑动的时候可以将另外两个滑动出来,手松开后会执行移动动画并重置三个View的状态

Banner

示例代码:

api:

/**
 * 可以自动循环轮播的ComposePager
 * [pageCount]一共有多少页
 * [modifier]修饰
 * [bannerState]Banner的状态
 * [orientation]滑动的方向
 * [userEnable]用户是否可以滑动,等于false时用户滑动无反应,但代码可以执行翻页
 * [autoScroll]是否自动滚动
 * [autoScrollTime]自动滚动间隔时间
 * [content]compose内容区域
 */
@Composable
fun Banner(
    pageCount: Int,
    modifier: Modifier = Modifier,
    bannerState: BannerState = rememberBannerState(),
    orientation: Orientation = Orientation.Horizontal,
    userEnable: Boolean = true,
    autoScroll: Boolean = true,
    autoScrollTime: Long = 3000,
    content: @Composable BannerScope.() -> Unit
)

原理:

其中内部使用了ComposePager,通过将传入的pageCount*n变为无限循环,然后内部开启一个协程,不停调用ComposePager的State的切换到下一页的api就实现了Banner

引入项目

在根项目的build.gradle文件中加入:

allprojects {
    repositories {
        maven { url https://jitpack.io }
        ...
    }
}

app的build.gradle中加上,最新版本参考:

dependencies{
    ...
    implementation com.github.ltttttttttttt:ComposeViews:1.0.9
}

然后就可以愉快的使用ComposePager和Banner了

项目已开源,欢迎star:

并且项目中不止有ComposePager,还有更多好用的Compose组件,比如:

FlowLayout

GoodTextField和PasswordTextField

后续还会添加更多的Compose组件

end

经验分享 程序员 微信小程序 职场和发展