在 Jetpack Compose 中创建垂直滑块

2023-12-14

我正在构建一个Android应用程序,需要在同一页面中创建多个垂直滑块用于音乐均衡器调整,但我只能从官方材料设计文档中找到水平滑块。

我尝试从官方文档中实现默认滑块并使用修改器旋转它并且它可以工作,但问题是我现在无法使用调整高度Modifier.

screenshot

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Row(modifier =
            Modifier
                .fillMaxWidth()
                .fillMaxHeight(),
               horizontalArrangement = Arrangement.SpaceBetween,
                verticalAlignment = Alignment.CenterVertically
                ) {
                slider()
                slider()
                slider()
                slider()
                slider()
                slider()
                slider()

            }

        }
    }
}



@Composable
fun slider() : Int
{
    var sliderPosition by remember { mutableStateOf(0f) }

    Slider(
        modifier = Modifier
            .width(50.dp)
            .height(120.dp)
            .background(color = Color.Red)
            .wrapContentSize()
            .rotate(270F)
            .padding(start = 0.5.dp),

        value = sliderPosition,
        valueRange = 1f..10f,
        onValueChange = {sliderPosition = it}
    )

    return sliderPosition.roundToInt()
}


旋转的滑块不会填充可用高度,因为它在旋转后受到错误的约束。要解决这个问题,您首先需要交换width and height values.

Next, Modifier.rotate不会改变视图位置,因此旋转后需要手动更新。要了解发生了什么,您可以运行以下代码:

Box(
    contentAlignment = Alignment.Center,
    modifier = Modifier.fillMaxSize()
) {
    Box(Modifier
        .size(100.dp, 50.dp)
        .border(width = 1.dp, color = Color.Red)
        .rotate(90f)
        .background(Color.Green))
}

它将产生以下视图:

如您所见,真实视图框架显示有红色边框,并且您的视图有意外的偏移。

要修复它,您可以使用Modifier.layout:您需要交换约束和结果视图大小尺寸,并恢复偏移。

我也在用Modifier.graphicsLayer with transformOrigin设置为零点,因此更容易计算所需的偏移量Modifier.layout.

最后一部分,尺寸修饰符应该放在后面Modifier.layout,以便在期间获取父视图约束而不是静态约束layout. And layout应旋转后放置。详细了解为什么修饰符顺序很重要这个答案

滑块的最终修改器:

Modifier
    .graphicsLayer {
        rotationZ = 270f
        transformOrigin = TransformOrigin(0f, 0f)
    }
    .layout { measurable, constraints ->
        val placeable = measurable.measure(
            Constraints(
                minWidth = constraints.minHeight,
                maxWidth = constraints.maxHeight,
                minHeight = constraints.minWidth,
                maxHeight = constraints.maxHeight,
            )
        )
        layout(placeable.height, placeable.width) {
            placeable.place(-placeable.width, 0)
        }
    }
    .width(120.dp)
    .height(50.dp)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Jetpack Compose 中创建垂直滑块 的相关文章

随机推荐

  • 如何在 Vim 中用编号标签替换 CSV 列分隔符?

    我想用不同的值替换一系列管道字符 我该如何使用正则表达式来做到这一点 Example This is a sentence And this is the second one 最后结果 This new is new2 a new3 se
  • 循环回到代码中的特定点

    所以我正在编写一个小游戏 我试图做一些我不明白该怎么做的事情 我定义了一个函数 当代码不满足任何条件时 我希望它返回到另一行代码 但我不明白该怎么做 这是我正在处理的代码的一部分 print What s your favourite ty
  • 序列化与内爆

    您认为在 MySQL 数据库的记录中存储一些图像 ID 的更好方法是什么 这只是图像 ID 将用于从不同的库中获取图像 我是否会像 1 4 7 9 10 12 这样破坏记录中的 id 还是只是序列化数组并存储它 使用其中一种而不是另一种是否
  • 直到在 FluentWait 中无法应用 - java

    我之前有一个 Selenium 的辅助类 它的作用就像一个魅力 突然之间 这个问题出现了 我还附上了受影响功能的屏幕截图 直到 java util function Function 在 FluentWait 中无法应用 到 org ope
  • 如何将 QWebEngineProfile 设置为 QWebEngineView

    我想将不同的 QWebEngineProfiles 设置为不同的 QWebEngineViews 这意味着每个视图都有自己的 cookie 存储 我找不到任何有关它的文档 因此我们将不胜感激所有帮助 任何将独立 cookie 存储设置为独立
  • 在 GWT 中使用查询字符串

    我必须创建一个包含用户 ID 和电子邮件参数的动态 URL 它将直接指向我的 GWT 应用程序中的注册表单 我想设置和获取查询字符串中的参数 我已经提到tphttp code google com p gwt examples source
  • 无法使用java命令行打开PDF文件

    我正在尝试使用命令行参数从 java 打开 PDF 文件 String command cmd c start AcroRd32 exe dir 但是当文件自动打开时我收到错误 Windows cannot find acroRd32 ex
  • 线程访问另一个线程的堆栈

    我的想法是否正确 线程可以访问另一个线程堆栈中存在的变量 这是假设实例化堆栈变量的函数尚未返回 我想我在某处读到线程应该只共享堆内存 但我现在怀疑这是否正确 这是在 C 中使用 POSIX pthreads 严格来说 从提供线程支持 但接口
  • 什么是 XAML 在未处理的异常和 app.g.i.cs 文件上生成的中断

    我是 Windows 应用程序开发新手 我正在尝试使用 x64 平台在本地计算机上执行解决方案 但每当我执行 Button Click 事件时 我都会收到此异常 if DEBUG DISABLE XAML GENERATED BREAK O
  • jQuery 添加的 div 上的 Google 地图 addDomListener 只能看到循环的最后一次迭代

    我有以下简单的脚本 var fruits new Array apple orange lemon fruit canvas append Mouse over these fruits for var i 0 i lt fruits le
  • maven-cxf-codegen-plugin 使用 Jaxb 绑定为所有生成的类添加继承

    我正在使用 Apache CXF 的 cxf codegen plugin 将 wsdl 转换为 java 对象 我指定了一个绑定文件来添加额外的 jaxb 处理 我希望所有这些文件都从接口继承 或扩展抽象类 我的问题是 虽然我可以使用一个
  • 基于 Leaflet 和 AngularJS 的地图未正确加载

    我的基于 Leaflet 和 AngularJS 的地图无法正确加载 我不知道发生了什么 但地图图块没有按应有的方式布局 这是底图 这是我的代码 function setMapPosition scope center lat 51 505
  • 在shinyApp中使用R text2vec包和LDAvis的LDA主题模型

    以下是使用 R text2vec 包进行 LDA 主题建模的代码 library text2vec tokens docs text gt docs text a colection of text documents word token
  • 对 tsvector 中的每个元素使用 Levenshtein 函数?

    我正在尝试使用 Postgres 创建模糊搜索 并一直使用 django watson 作为基本搜索引擎来工作 我有一个名为 search tsv 的字段 它是一个 tsvector 其中包含我要搜索的模型的所有字段值 我想使用 Leven
  • 在网页中添加“导出到 Excel”按钮,以在 Web 应用程序中将 gridview 导出到 Excel

    我为诊所构建了一个患者管理软件 我需要将患者列表从 ASP net 网格视图导出到 Excel 文件 我的问题是 有没有办法将gridview导出到excel 我正在使用 vb net 和 Visual Web Developer 2010
  • 在 BeautifulSoup 中将一个标签替换为另一个标签

    我试图在 XML 文档中查找标签 并用新标签完全替换它 我认为下面应该有效 para monograph find para text Some text newpara
  • 如何在R中将减号从右移到左/从后到前?

    我已从文本文件导入数据 负数的形式为 100 右侧的减号 我应该将其转换为 100 任何想法 提前致谢 我们可以使用以下方法来做到这一点sub 我们将数字作为一个组来捕获 d 后面跟着一个 在最后 的字符串并替换为 接下来是反向引用 1 的
  • navigator.getusermedia

    我正在研究 html5 新规范 尤其是网络摄像头功能 By 按照本教程 我收到以下错误 Native web camera streaming getUserMedia is not supported in this browser 这是
  • 使用 Python OpenCV 删除图像的黑色标题部分

    我需要使用 Python CV 删除图像多个部分的黑色部分 我尝试过去噪 但没有给出令人满意的结果 例如 我需要删除表标题中的黑色部分 下图 并将标题背景转换为白色 内容为黑色 谁能帮助我选择正确的库或解决方案来克服这个问题 正如您所看到的
  • 在 Jetpack Compose 中创建垂直滑块

    我正在构建一个Android应用程序 需要在同一页面中创建多个垂直滑块用于音乐均衡器调整 但我只能从官方材料设计文档中找到水平滑块 我尝试从官方文档中实现默认滑块并使用修改器旋转它并且它可以工作 但问题是我现在无法使用调整高度Modifie