Compose回忆童年 - 手拉灯绳-开灯/关灯

本文通过Jetpack Compose创建了一个模拟拉绳开关的互动效果,包括使用Animatable实现拖拽动画,以及结合PointerInput检测触摸操作。在回忆童年乐趣的同时,展示了Compose在UI交互上的灵活性。

一、前言

偶然间想到小时候顺着那白色开关垂下来的灯绳,拉一下“咔哒”一声,再拉一下又是“咔哒”一声。当时年龄小感觉新奇总是把灯开了关又关了开的拉着玩,以至于好几次拉坏了开关灯绳。

今天我们在手机上做一个拉不坏的灯绳😄,怀念一下童年🤣。

82年钨丝灯.png

二、材料准备

  1. 在App里面准备一个弹簧绳😄,我们想奢侈一下,躺在床上拉灯绳。
  2. 绳末尾底部的疙瘩,替换成:夜光球 ,毕竟现在2022年了,夜晚总不能黑灯瞎火摸着找灯绳吧,你们觉得呢?
  3. 准备一个82年的钨丝灯泡💡,拉菲也得配个82年的,才有氛围感。

三、安装82年的钨丝灯和灯绳

我们要知道材料所需要占用最大的宽度和最小宽度,可以用BoxWithConstraints做容器,里面放我们的灯泡灯绳以及我们的“夜光球”。

我们知道BoxWidthConstraints可以获得屏幕上Composable最小/最大可用宽度和高度,可以根据可用空间使用它来显示不同的内容。

1. 使用Image来显示我们的钨丝灯:

Image(
   alpha = state.wsdAlpha,
   modifier = Modifier.align(Alignment.TopCenter).size(100.dp),
   painter = painterResource(id = R.drawable.ic_wsd),
   contentDescription = null
)

2. 穿好我们的弹簧灯绳,绘制一条线🧵,我们这里还需要用到Modifier.matchParentSize 填充可用空间

Box(
    modifier = Modifier
        .matchParentSize()
        .ropeLine(ropeHandleState)
)

// 绘制我们的弹簧绳
fun Modifier.ropeLine(
    state: RopeHandleState
): Modifier {
    return drawBehind {
        val bulbPosition = state.ropeHandleOffset
        drawLine(
            Color.DarkGray,
            start = Offset(x= size.width * 0.8F,y = 0f),
            end = bulbPosition,
            ROPE_LINE_WIDTH.toPx()
        )
    }
}

这里我们使用ModifierdrawBehind修饰符,大家可以去看一下Compose性能优化篇,仅在绘制阶段读取“绳子”拉动的距离,因此,Compose 可以完全跳过组合阶段和布局阶段 , 当距离发生变化时,Compose 会直接进入绘制阶段。

3. 我们需要给“夜光球”增加2个功能,“点击开/关灯”,“借力拉绳

点击功能:我们可以通过PointerInputScope#detectTapGestures来实现点击功能。

借力拉伸功能:就是我们的拖拽功能,我们可以通过PointerInputScope#detectDragGestures来实现拖拽的功能。

通过Modifieroffset修饰符,更新x轴y轴的位置。

大家先看看我们的“夜光球”的全部代码,下面我们会介绍RopeHandleState

@Composable
fun LightButton(
<think>我们正在尝试彻底删除系统中的docker-compose,但之前已经执行了多个删除命令后,运行`docker-compose --version`仍然显示版本信息。因此,我们需要找出系统中所有残留的docker-compose文件路径。 根据引用[2]的建议,我们可以使用`find`命令来搜索整个文件系统中名为`docker-compose`的文件。命令如下: ```bash sudo find / -name docker-compose 2>/dev/null ``` 这个命令会从根目录`/`开始搜索,`2>/dev/null`是为了将错误信息(如权限不足)重定向到空设备,从而只显示找到的文件路径。 执行此命令后,系统会列出所有名为`docker-compose`的文件路径。然后,我们可以根据这些路径逐一删除。 此外,考虑到docker-compose可能以插件形式存在(如v2版本),我们还需要查找可能存在的其他路径,例如: - `~/.docker/cli-plugins/` - `/usr/local/lib/docker/cli-plugins/` - `/usr/lib/docker/cli-plugins/` - `/usr/local/bin/` - `/usr/bin/` 但为了确保不遗漏,直接使用`find`命令搜索整个文件系统是最稳妥的。 注意:由于docker-compose v2版本是作为docker的插件存在的,其可执行文件名也是`docker-compose`,因此上述命令同样可以找到v2版本。 在删除所有找到的文件后,建议执行以下命令刷新命令缓存: ```bash hash -r ``` 然后再次尝试运行`docker-compose --version`,应该会提示命令未找到。 如果仍然存在,则可能是由于环境变量中配置了别名(alias)或者函数(function),我们可以通过以下命令检查: ```bash alias docker-compose 2>/dev/null declare -f docker-compose 2>/dev/null ``` 另外,如果之前通过包管理器(如apt、yum)安装过docker-compose,还需要使用包管理器卸载: - 对于Debian/Ubuntu系统:`sudo apt purge docker-compose docker-compose-plugin` - 对于CentOS/RHEL系统:`sudo yum remove docker-compose docker-compose-plugin` - 对于Fedora:`sudo dnf remove docker-compose docker-compose-plugin` 最后,如果系统中安装了Docker Desktop,它可能内置了docker-compose,需要卸载Docker Desktop才能完全移除。 现在,我们首先执行查找命令,找出所有残留的docker-compose文件路径。</think>### 彻底查找系统中所有 docker-compose 文件路径的方法 要找出系统中所有残留的 `docker-compose` 文件路径,请执行以下命令: ```bash # 搜索所有 docker-compose 文件(忽略权限错误) sudo find / -type f -name docker-compose 2>/dev/null # 搜索所有包含 docker-compose 的目录(包括插件路径) sudo find / -type d -name '*docker-compose*' 2>/dev/null ``` #### 执行结果分析: 命令会列出系统中所有 `docker-compose` 文件的完整路径,常见位置包括: 1. **传统安装路径** `/usr/local/bin/docker-compose` `/usr/bin/docker-compose` 2. **插件安装路径** `~/.docker/cli-plugins/docker-compose` `/usr/lib/docker/cli-plugins/docker-compose` `/usr/local/lib/docker/cli-plugins/docker-compose` 3. **包管理器安装路径** `/snap/bin/docker-compose` (Snap 安装) `/opt/homebrew/bin/docker-compose` (Homebrew 安装) 4. **Docker Desktop 集成路径** `/Applications/Docker.app/Contents/Resources/bin/docker-compose` (macOS) `/usr/libexec/docker/cli-plugins/docker-compose` (Linux) #### 完整清理流程: ```bash # 1. 查找所有残留文件 PATHS=$(sudo find / -type f -name docker-compose 2>/dev/null) # 2. 删除找到的所有文件 echo "$PATHS" | xargs sudo rm -f # 3. 刷新命令缓存 hash -r && sudo updatedb # 4. 验证是否完全删除 docker-compose --version # 应显示"command not found" ``` > **注意**:如果发现文件在 `/snap/` 或 `/opt/` 目录下,可能需要通过包管理器卸载: > ```bash > # Snap安装 > sudo snap remove docker > > # Homebrew安装 > brew uninstall docker-compose > ``` #### 常见残留原因: 1. **多版本共存**:V1(二进制)和V2(插件)同时存在不同路径[^2] 2. **包管理器残留**:APT/YUM/Snap等未完全卸载 3. **环境缓存**:Shell缓存未刷新(`hash -r`解决) 4. **Docker Desktop集成**:内置compose组件需单独卸载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Halifax ‎

交个朋友

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值