5、Compose 里实现 Slider气泡

5、Compose 里实现 Slide气泡

有两种方式实现气泡
1、是写一个box布局根据Slide拖动计算位置,实现气泡
2、写两个Slider组件用Box包住,将底下那个Slider的thumb自定义后往上移动

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SliderWithBubble(
    sliderPosition: Float,
    enable: Boolean,
    actTrackColors: Color,
    inactTrackColors: Color,
    onSliderEvent: (Float) -> Unit
) {
    Box {
        var currentPosition = sliderPosition
        var showBubble by remember { mutableStateOf(false) }
		// 这个实在底下的那个Slider,大部分不可见,只有Thumb上移的这个地方可以看见
        Slider(
            modifier = Modifier.size(1126.dp, 74.dp),
            valueRange = -5f..5f,
            value = currentPosition,
            onValueChange = { it ->
                currentPosition = it
            },
            thumb = { // 自定义thumb 使用box
                if (showBubble) {
                    Column(
                        modifier = Modifier.offset(y = (-70).dp),
                        horizontalAlignment = Alignment.CenterHorizontally
                    ) {
                        Box(
                            modifier = Modifier
                                .width(64.dp)
                                .height(64.dp)
                                .clip(RoundedCornerShape(100))
                                .background(sliderActiveThumbBubbleColors),
                            contentAlignment = Alignment.Center
                        ) {
                            Text(
                                modifier = Modifier.size(50.dp),
                                color = customColors.textColor,
                                fontSize = 32.sp,
                                textAlign = TextAlign.Center,
                                softWrap = true,
                                text = currentPosition.roundToInt().toString()
                            )
                        }
                        Row {
                            DrawInvertedTriangle(5.dp, customColors.sliderActiveThumbBubble)
                        }
                    }
                } else {
                    Column(
                        modifier = Modifier
                            .width(64.dp)
                            .height(64.dp)
                            .clip(RoundedCornerShape(20.dp))
                            .background(Color.Transparent)
                    ) {}
                }
            }
        )

        // use box show bubble
        /*val bubbleOffset = Offset(
            x = (((600 / 11 + (600 % 11) * 0.1) * sliderPosition).toFloat()).roundToInt().toFloat(),
            y = (-2).dp.value
        )

        if (showBubble) {
            Column(
                modifier = Modifier.offset(bubbleOffset.x.dp, (-8).dp),
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Box(
                    modifier = Modifier
                                .width(64.dp)
                                .height(65.dp)
                        .clip(RoundedCornerShape(20.dp))
                        .background(Color.Black),
                    contentAlignment = Alignment.Center
                ) {
                    Text(
                        color = Color.White,
                        text = sliderPosition.roundToInt().toString()
                    )
                }
                Row {
                    DrawInvertedTriangle(5.dp, Color.Black)
                }
            }
        }*/
		// 用户可以看见的Slider,
        Slider(
            modifier = Modifier.size(1126.dp, 74.dp),
            valueRange = -5f..5f,
            value = currentPosition,
            onValueChange = { newPosition ->
                onSliderEvent(newPosition)
                showBubble = true
            },
            onValueChangeFinished = {
                showBubble = false
            },
            steps = 9,
            enabled = enable,
            thumb = {
                Box(
                    modifier = Modifier
                        .width(64.dp)
                        .height(64.dp)
                        .clip(RoundedCornerShape(100))
                        .background(customColors.sliderActiveThumb),
                    contentAlignment = Alignment.Center
                ) {
                    Text(
                        modifier = Modifier.size(50.dp),
                        color = customColors.pureBlack,
                        fontSize = 32.sp,
                        textAlign = TextAlign.Center,
                        softWrap = true,
                        text = currentPosition.roundToInt().toString()
                    )

                }
            },
            track = { sliderPositions ->
                SliderDefaults.Track(
                    modifier = Modifier
                        .scale(scaleX = 1f, scaleY = 2f),
                    sliderPositions = sliderPositions,
                    colors = SliderDefaults.colors(
                        //滑动条头部的颜色
                        // thumbColor = Color.Red,
                        //滑动轨道的颜色
                        activeTrackColor = actTrackColors,
                        inactiveTrackColor = inactTrackColors,
                        //滑动轨道上刻度尺的颜色
                        activeTickColor = sliderActiveTickColors,
                        inactiveTickColor = sliderActiveTickColors,
                    ),
                )
            }
        )
    }
}

@Composable
fun DrawInvertedTriangle(sz: Dp, cr: Color) {
    Canvas(modifier = Modifier.size(sz)) {
        val path = Path().apply {
            moveTo(0f, 0f) // 移动到顶点
            lineTo(size.width, 0f) // 画出左边的线
            lineTo(size.width / 2, size.height) // 画出右边的线
            close() // 闭合路径
            drawPath(this, cr)
        }

        drawPath(
            path = path,
            color = cr,
            style = Stroke(width = 2.dp.toPx())
        )
    }
}
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我来为您介绍一下使用docker-compose实现容器编排的具体步骤。 首先,您需要安装Docker和Docker Compose。具体安装方法可以参考官方文档。 接着,您需要创建一个docker-compose.yml文件,在该文件中定义您需要的服务和容器。例如,以下是一个简单的docker-compose.yml文件: ``` version: '3' services: web: image: nginx ports: - "8080:80" db: image: mysql environment: MYSQL_ROOT_PASSWORD: example MYSQL_DATABASE: test MYSQL_USER: test MYSQL_PASSWORD: test ``` 该文件定义了两个服务:web和db。web服务使用nginx镜像,并将本地主机的8080端口映射到容器的80端口。db服务使用mysql镜像,并设置了一些环境变量。 接下来,您可以使用docker-compose命令来启动这些服务。在终端中进入docker-compose.yml文件所在目录,输入以下命令: ``` docker-compose up ``` 该命令会启动所有定义在docker-compose.yml文件中的服务,并将它们连接在一起。 如果您需要在后台运行服务,可以使用以下命令: ``` docker-compose up -d ``` 如果您需要停止服务,可以使用以下命令: ``` docker-compose down ``` 这些命令将会停止并删除所有的容器和网络。如果您只想停止服务,而不删除容器和网络,可以使用以下命令: ``` docker-compose stop ``` 以上就是使用docker-compose实现容器编排的基本步骤。当然,您可以根据需要定义更多的服务和容器,并使用docker-compose命令来管理它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值