技术探索:开源分享 - 在Jetpack Compose中实现iOS丝滑左滑菜单交互设计

背景

最近遇到个需求,jetpack compose中要给列表的item加一个左滑删除菜单,左滑展示一个删除按钮,点击删除item,很简单的需求,然而Google了一圈,只发现了compose自带的SwipeToDismiss和类似的一个开源库me.saket.swipe:swipe比较有用,但是细看不太符合需求,SwipeToDismiss顾名思义就是滑动到某个地方item就会dismiss,不符合要求的swipe后点击再dismiss的需求啊(测试不接受你有啥办法),自己动手呗!!

swipe这个库写得比较简单且支持compose multiplatform,果断在这个库的基础上来修改。

先上成果

少啰嗦,先看东西!觉得有用的话给个star呗~

swipe-like-ios

swipe-like-ios builds composables that can be swiped left or right for revealing actions

groovy 复制代码
// settings.gradle.kts
repositories {
  maven { setUrl("https://www.jitpack.io") }
}

// build.gradle.kts
implementation("com.linversion.swipe:swipe-like-ios:latest-version")
kotlin 复制代码
val archive = SwipeAction(
  icon = rememberVectorPainter(Icons.TwoTone.Archive),
  background = Color.Green,
  onClick = { ... }
)

val replyAll = SwipeAction(
  icon = rememberVectorPainter(Icons.TwoTone.ReplyAll),
  background = Color.Perfume,
  onClick = { println("Reply swiped") }
)
  
val snooze = SwipeAction(
  icon = { Text("Snooze") },
  background = Color.Yellow,
  onClick = { ... },
)

SwipeableActionsBox(
  startActions = listOf(replyAll),
  endActions = listOf(snooze, archive),
  swipeThreshold = 80.dp,
) {
  // Swipeable content goes here.
}

简单介绍一下实现原理

其实很简单,就是在item的左右两边分别用一个Row放置你的菜单(action),给个初始的offsetX,使得菜单刚好不可见,滑动的时候改变ofssetX,每个action平分滑动的空间,直到菜单完全展示后加一个阻尼的效果,完全仿照iOS的实现。

对比之下SwipeToDismiss的原理是在item的底部放一个Row来摆放你的action,滑动的时候就可以看到了。

滑动的监听则都是用Modifier的draggable修饰符,然后给item设置absoluteOffset

kotlin 复制代码
Box(
    modifier = Modifier
      .absoluteOffset { IntOffset(x = offsetX, y = 0) }
      .draggable(
        orientation = Horizontal,
        enabled = !state.isResettingOnRelease,
        onDragStopped = {
          scope.launch {
            state.handleOnDragStopped()
          }
        },
        state = state.draggableState,
      ),
    content = content
  )

后续期望

仔细看了一下,iOS在有些场景也有SwipeToDismiss的效果,并且加了震动效果,后续会考虑拓展加上这个效果。

相关推荐
FlightYe4 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
法欧特斯卡雷特4 小时前
Kotlin 2.4.20 现已发布,新特性多不多?
android·开源·全栈
摇滚侠4 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 31
android·spring boot·笔记
cnnews4 小时前
Ubuntu 编译 postmarketOS
linux·运维·arm开发·ubuntu·github·音视频
Zeaon5 小时前
别再手写筛选栏了:一个可组合的 Flutter 选择组件(5 入口 × 7 委托)
android·flutter
Michaelwubo5 小时前
mysql8 主从 HA切换
android·adb
墨狂之逸才5 小时前
Android 工业手持机蓝牙扫描失败:为什么同时需要蓝牙和定位权限
android
Android打工仔6 小时前
Kotlin 协程源码解析(七)`delay()` 到底是如何在 `Dispatchers.Main` 上恢复的?
android·kotlin
逛逛GitHub6 小时前
把最新开源的 2B 端侧模型接入 DeepSeek Harness,有点子神奇。
github
律宏阔6 小时前
Android 红外功能实现与红外协议开发笔记:ConsumerIrManager、NEC、PWM、曼彻斯特编码
android