概览

Compose提供了多个api用来实现各种手势,这些手势包括点击、按压、双击、长按、水平垂直滑动、拖动、双指平移缩放旋转、嵌套欢动效果

各种手势效果介绍

点击手势

代码

Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {Box(modifier = Modifier.size(200.dp).background(Color.Green).clickable {App.toast("被点击")}, contentAlignment = Alignment.Center) {Text(text = "点击事件")}}

效果

单点、按压、双击、长按

代码

@Composable
fun PointerView() {Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {Box(modifier = Modifier.size(200.dp).background(Color.Green).pointerInput(Unit) {detectTapGestures(onTap = {App.toast("单点事件触发")},onDoubleTap = {App.toast("双击事件")},onPress = {//                            App.toast("按压事件")},onLongPress = {App.toast("长按事件")})}, contentAlignment = Alignment.Center) {Text(text = "单点、双击、按压、长按事件")}}
}

说明

双击、单击、长按都会触发按压的效果回调,
pointerInput.detectTapGestures

效果

水平和垂直滑动

代码

val list = (0..255)Column(Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {Box(Modifier.fillMaxWidth(10f).height(100.dp).background(Color.Green).horizontalScroll(rememberScrollState()),contentAlignment = Alignment.Center) {Text(text = "安安安安卓,欢迎关注掘金号、公众号、csdn,分享android相关知识,安安安安卓,欢迎关注掘金号、公众号、csdn,分享android相关知识,安安安安卓,欢迎关注掘金号、公众号、csdn,分享android相关知识",style = TextStyle(color = Color.White, fontSize = 20.sp, fontWeight = FontWeight.Bold))}repeat(40) {Box(Modifier.height(80.dp).fillMaxWidth().background(Color(list.random(), list.random(), list.random())),contentAlignment = Alignment.Center) {Text(text = it.toString(), style = TextStyle(color = Color.White, fontSize = 20.sp))}}}

说明

任何控件,只需要调用一下两个修饰符就可以实现滑动效果

.verticalScroll(rememberScrollState())

.horizontalScroll(rememberScrollState())

效果

拖动手势

代码

var offsetX by remember {mutableStateOf(0f)}var offsetY by remember {mutableStateOf(0f)}Box(Modifier.fillMaxSize()) {Box(Modifier.offset { IntOffset(offsetX.toInt(), offsetY.toInt()) }.size(200.dp).background(Color.Green, shape = CircleShape).pointerInput(Unit) {detectDragGestures(onDrag = { pointerInputChange: PointerInputChange, offset: Offset ->pointerInputChange.consumeAllChanges()//消费滑动offsetX += offset.xoffsetY += offset.y})},contentAlignment = Alignment.Center) {Text(text = "轻按滑动圆")}}

说明

效果

多段滑动

代码

val list = (0..255)val width = 300.dpval squareSize = 60.dpval swipeableState = rememberSwipeableState(0)val sizePx = with(LocalDensity.current) { squareSize.toPx() }val anchors = mapOf(0f to 0,sizePx to 1,sizePx * 2 to 2,sizePx * 3 to 3,sizePx * 4 to 4) // Maps anchor points (in px) to statesBox(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {Row(Modifier.width(width).height(squareSize)) {repeat(5) {Box(Modifier.width(squareSize).fillMaxHeight().background(color = Color(list.random(), list.random(), list.random())))}}Box(modifier = Modifier.width(width).swipeable(state = swipeableState,anchors = anchors,thresholds = { _, _ -> FractionalThreshold(0.3f) },orientation = Orientation.Horizontal)) {Box(Modifier.offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }.width(squareSize).height(200.dp).background(Color.Yellow)){Text(text = "滑动滑块")}}}

说明

这是个实验性质的代码

这里的关键代码如下:
这个anchors会把父容器分为五段,当滑动结束,滑动控件会自动平移到合适的区域位置。

 val anchors = mapOf(0f to 0,sizePx to 1,sizePx * 2 to 2,sizePx * 3 to 3,sizePx * 4 to 4)

效果

双指手势(平移、缩放、旋转)

代码

var scale by remember { mutableStateOf(1f) }var rotation by remember { mutableStateOf(0f) }var offset by remember { mutableStateOf(Offset.Zero) }val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->scale *= zoomChangerotation += rotationChangeoffset += offsetChange}Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {Box(Modifier// apply other transformations like rotation and zoom// on the pizza slice emoji.graphicsLayer(scaleX = scale,scaleY = scale,rotationZ = rotation,translationX = offset.x,translationY = offset.y)// add transformable to listen to multitouch transformation events// after offset.transformable(state = state).background(Color.Green).fillMaxSize(0.5f),contentAlignment = Alignment.Center){Text(text = "两指操作,平移,缩放,z轴旋转,单指操作不会有效果", color = Color.White)}}

说明

效果

嵌套滑动效果

代码

val toolbarHeight = 48.dp//Topbar的高度val toolbarHeightPx = with(LocalDensity.current) { toolbarHeight.roundToPx().toFloat() }//topbar高度转换为pxval toolbarOffsetHeightPx =remember { mutableStateOf(0f) }//topbar的动态垂直平移距离val nestedScrollConnection = remember {object : NestedScrollConnection {override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset {val delta = available.yval newOffset = toolbarOffsetHeightPx.value + delta//更新topbar的动态平移距离toolbarOffsetHeightPx.value = newOffset.coerceIn(-toolbarHeightPx, 0f)//保证topbar的平移距离在(-toolbarHeightPx, 0f)之间return Offset.Zero}}}Box(Modifier.fillMaxSize().nestedScroll(nestedScrollConnection)) {LazyColumn(contentPadding = PaddingValues(top = toolbarHeight)) {items(100) { index ->Text("I'm item $index", modifier = Modifier.fillMaxWidth().padding(16.dp))}}TopAppBar(modifier = Modifier.height(toolbarHeight).offset { IntOffset(x = 0, y = toolbarOffsetHeightPx.value.roundToInt()) },title = { Text("toolbar offset is ${toolbarOffsetHeightPx.value}") })}

说明

效果

git地址:https://github.com/ananananzhuo-blog/ComposeGestureSample

Jetpack Compose详尽介绍相关推荐

  1. JetPack Compose简单介绍

    它是2019 年 I/O 大会上公布的新的 UI 库,在今年下半年会发布它的正式版. 既然它是一个UI库,那就要和我们传统写UI的方式作对比了. ①传统写UI的方式:就是先在建立一个xml文件,在里面 ...

  2. jetpack compose原理解析

    目录 jetpack compose原理解析 jetpack compse 声明式ui开发 原理分析 整体框架介绍 compose LayoutNode布局介绍 @Composeable注解实现细节 ...

  3. Jetpack Compose入门详解(实时更新)

    Jetpack Compose入门详解 前排提醒 前言(Compose是什么) 1.实战准备 一.优势与缺点 二.前四课 三.标准布局组件 1.Column 2.Row 3.Box 四.xml和com ...

  4. Jetpack Compose 从入门到入门(六)

    本篇说说Compose中的Canvas. 1. Canvas @Composable fun Canvas(modifier: Modifier,onDraw: DrawScope.() -> ...

  5. Jetpack Compose for Desktop: 里程碑1发布

    在深入详解 Jetpack Compose | 优化 UI 构建 中谷歌介绍了为什么要设计 Jetpack Compose 来完成原生 Android 的开发,如今 Jetpack Compose f ...

  6. Jetpack Compose中的手势操作

    点击事件 监听点击事件非常简单,使用 clickable 和 combinedClickable 修饰符即可满足需求: @OptIn(ExperimentalFoundationApi::class) ...

  7. 详解Jetpack Compose中的Modifier修饰符

    前言 本文将会介绍Jetpack Compose中的Modifier.在谷歌官方文档中它的描述是这么一句话:Modifier元素是一个有序.不可变的集合,它可以往Jetpack Compose UI元 ...

  8. Jetpack Compose之手势使用

    前言 在一个应用中用户的交互操作非常多,如:点击.滑动.拖动等,这些操作统统离不开手势. 在正式介绍Compose手势前,我们先来了解下Jetpack Compose手势整体框架,做到心中有图. 一. ...

  9. Jetpack Compose 深入探索系列一:Composable 函数

    Composable 函数的含义 如果我们只专注于简单的语法,任何标准的Kotlin函数都可以成为一个可组合函数,只需将其注解为@Composable: 通过这样做,我们实际上是在告诉编译器,该函数打 ...

最新文章

  1. CCNA基础 IP地址子网划分
  2. react-flux单向数据流
  3. UVALive - 3902 Network
  4. JQuery中$.ajax()分享
  5. python 格式话-占位符
  6. 笔试算法复习——数组去重
  7. 《金色梦乡》金句摘抄(一)
  8. java sql objects_第十五章-简书.sql
  9. Android环境搭建配置问题(ZT)
  10. python北风网培训班视频
  11. JavaScript最详细基础语法总结(跳坑记录!)
  12. 域名Whois信息查询接口
  13. relativePath
  14. 重磅开源:阿里妈妈技术质量开源了线上测试MagicOTP和性能测试平台ACP
  15. python爬取整个网页,教师节不知道给老师送什么?
  16. 使用AVPlayer播放本地,或网络音频文件
  17. 好玩的程序,看大神如何玩转编程
  18. 长亮科技正式加入openGauss社区
  19. 【调剂】航天二院硕士招收控制/电子/计算机相关专业研究生调剂
  20. 游戏修改器的基本工作原理

热门文章

  1. 【C#】TODO的作用
  2. Python中的三维坐标空间
  3. Qt扫盲-QNetworkAccessManager理论总结
  4. mysql使用INSERT INTO ON DUPLICATE KEY UPDATE导致dead lock分析和解决
  5. 2008年最新的美国FBI犯罪心理测试题
  6. 1978年的图灵奖获得者-Robert W. Floyd
  7. 欲见未见:曦光未昕,静池林影,放酒当歌,
  8. java堆栈分析工具_JVM内存分析工具使用
  9. Discuz!开发之论坛主题列表页标题长度的限制方法
  10. 如何理解「数字化是 IT 公司在给传统企业贩卖焦虑」?