有没有办法通过与另一个修饰符链接来增加可组合项的大小?

2023-12-28

在jetpack Compose时使用Layout or SubcomposeLayout您可以使用以下方法来衡量您的可组合项Constraints limits.

如果有一个固定大小的 Modifier,Modifier.size(500.dp),比方说 Int 中的 1000x1000,如果任何子 Composable 需要具有 1100x1000px 大小,layout函数应该是

layout(1100, 1100){

}

since Constraints当 Modifier.size() 或 Modifier.sizeIn(maxWidth, maxHeight) 使用可组合中断和跳跃作为大小之间的差异时, maxWidth=1000 和 maxHeight=1000 作为最大限制Modifier以及您分配给上面的布局功能的那个。

因此我需要增加大小Modifier在我将其设置为之前

SubcomposeLayout(
    modifier = modifier
) { constraints ->
    layout(width, height) {
   
    }
}

这对于任何人来说都是可能的吗Modifier例如Modifier.increseSize(15.dp)?我知道没有这样的修饰符,但我需要的是在将其设置为修饰符之前增加修饰符的大小Layout

我所做的是可扩展的 SubcomposeLayout。首先获取其主要内容(图像)的大小,然后将句柄大小添加到内容大小并设置layout(width,height)函数总大小为句柄和内容之和,大于内容大小或Modifier.size(),当约束不返回有界的上限宽度或高度来限制测量时,此方法有效。

总布局大小必须大于内容大小,因为可触摸区域应该每四分之一覆盖手柄,以便可以单击,正如您在图像中看到的那样,即使在内容区域手柄之外也可以接收手势。

@Composable
internal fun TransformSubcomposeLayout(
    modifier: Modifier = Modifier,
    handleRadius: Dp = 15.dp,
    mainContent: @Composable () -> Unit,
    dependentContent: @Composable (IntSize) -> Unit
) {

    val handleRadiusInPx = with(LocalDensity.current) {
        handleRadius.roundToPx()
    }

    SubcomposeLayout(
        modifier = modifier
    ) { constraints ->

        // Subcompose(compose only a section) main content and get Placeable
        val mainPlaceables: List<Placeable> = subcompose(SlotsEnum.Main, mainContent)
            .map {
                it.measure(constraints)
            }

        // Get max width and height of main component
        val maxSize =
            mainPlaceables.fold(IntSize.Zero) { currentMax: IntSize, placeable: Placeable ->
                IntSize(
                    width = maxOf(currentMax.width, placeable.width),
                    height = maxOf(currentMax.height, placeable.height)
                )
            }

        // Set  sum of content and handle size as total size of this Composable
        val width = maxSize.width + 2 * handleRadiusInPx
        val height = maxSize.height + 2 * handleRadiusInPx


        val dependentPlaceables = subcompose(SlotsEnum.Dependent) {
            dependentContent(maxSize)
        }.map {
            it.measure(constraints)
        }

        layout(width, height) {
            dependentPlaceables.forEach { placeable: Placeable ->
                // place Placeables inside content area by offsetting by handle radius
                placeable.placeRelative(
                    (width - placeable.width) / 2,
                    (height - placeable.height) / 2
                )
            }
        }
    }
}

enum class SlotsEnum { Main, Dependent }

我传递了内容大小,这样我就可以调整内容的大小

@Composable
fun TransformLayout(
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    handleRadius: Dp = 15.dp,
    handlePlacement: HandlePlacement = HandlePlacement.Corner,
    onDown: (Transform) -> Unit = {},
    onMove: (Transform) -> Unit = {},
    onUp: (Transform) -> Unit = {},
    content: @Composable () -> Unit
) {
    TransformSubcomposeLayout(
       // ???? !!! I'm not able to pass modifier from function because if it contains
       // a Modifier.size() it breaks layout() function
       // and because of that i can't set border, zIndex or any other Modifier from 
       // user. ZIndex must be set here to work, since it works against siblings
        modifier = Modifier.border(3.dp, Color.Green),
        handleRadius = handleRadius.coerceAtLeast(12.dp),
        mainContent = {
           // ???? Modifier from user is only used for measuring size
            Box(
                modifier = modifier,
                contentAlignment = Alignment.Center
            ) {
                content()
            }
        },
        dependentContent = { intSize: IntSize ->

            val dpSize = with(LocalDensity.current) {
                val rawWidth = intSize.width.toDp()
                val rawHeight = intSize.height.toDp()
                DpSize(rawWidth, rawHeight)
            }

            TransformLayoutImpl(
                enabled = enabled,
                handleRadius = handleRadius,
                dpSize = dpSize,
                handlePlacement = handlePlacement,
                onDown = onDown,
                onMove = onMove,
                onUp = onUp,
                content = content
            )
        }
    )
}

我想使用这个布局

    val density = LocalDensity.current
    val size = (500 / density.density).dp

TransformLayout(
    modifier = Modifier.size(size).border(5.dp, Color.Red).zIndex(100f),
    enabled = enabled,
    handlePlacement = HandlePlacement.Side
) {
    Image(
        painter = painterResource(id = R.drawable.landscape1),
        contentScale = ContentScale.FillBounds,
        contentDescription = "",
    )
}

如果我在修改器大小为 500x500 时设置布局(500+, 500+) 并将其设置为 SubcomposeLayout 修改器可组合项未放置在正确的位置。


可以通过创建修改器来更改修改器大小,例如SizeModifier。如果有人发布以这种方式完成任务的准确答案,将非常受欢迎。

我通过首先设置 requiredSize 来解决这个可组合项的最小尺寸。

@Composable
fun TransformLayout(
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    handleRadius: Dp = 15.dp,
    handlePlacement: HandlePlacement = HandlePlacement.Corner,
    onDown: (Transform) -> Unit = {},
    onMove: (Transform) -> Unit = {},
    onUp: (Transform) -> Unit = {},
    content: @Composable () -> Unit
) {

    MorphSubcomposeLayout(
        modifier = modifier
            .requiredSizeIn(
                minWidth = handleRadius * 2,
                minHeight = handleRadius * 2
            )
}

In SubcomposeLayout而不是通过句柄增加可组合项的大小,这不能与Modifier.size

我将最大尺寸限制为约束的 maxWidth 和 maxHeight

    // Get max width and height of main component
    var maxWidth = 0
    var maxHeight = 0

    mainPlaceables.forEach { placeable: Placeable ->
        maxWidth += placeable.width
        maxHeight = placeable.height
    }

    val handleSize = handleRadiusInPx * 2
    maxWidth = maxWidth.coerceAtMost(constraints.maxWidth - handleSize)
    maxHeight = maxHeight.coerceAtMost(constraints.maxHeight - handleSize)

    val maxSize = IntSize(maxWidth, maxHeight)

并通过了subcompose()函数到依赖可组合项作为内容的维度

val dependentPlaceables = subcompose(SlotsEnum.Dependent) {
    dependentContent(maxSize)
}.map {
    it.measure(constraints)
}

当我设置父级可组合项的尺寸时layout(width, height)

添加了我最初减去的手柄尺寸或面积

width = maxSize.width + 2 * handleRadiusInPx
height = maxSize.height + 2 * handleRadiusInPx

layout(width, height) {
    dependentPlaceables.forEach { placeable: Placeable ->
        placeable.placeRelative(0, 0)
    }
}

这样,当存在固定大小修饰符时,我能够通过句柄大小缩小内容区域,如果没有固定大小修饰符来限制与可组合性一样大的上限的测量,则它的工作原理如下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法通过与另一个修饰符链接来增加可组合项的大小? 的相关文章

随机推荐

  • 无法从资源目录加载属性文件

    我从 Git 存储库导入了一个项目 并在 Eclipse 中为其添加了 Maven 性质 在资源文件夹中 我添加了一个名为的配置文件myconf properties 现在 每当我尝试从 Java 代码打开这个文件时 我都会得到FileNo
  • 来自 C# 自定义操作的 MsiSetProperty

    action1如何从 C 自定义操作中设置 MSI 属性 到目前为止我已经有了这个 但如何获取句柄 DllImport msi dll CharSet CharSet Unicode static extern int MsiSetProp
  • 获取VBA中的子目录列表

    我想获取目录中所有子目录的列表 如果这有效 我想将其扩展为递归函数 然而 我最初获取子目录的方法失败了 它只是显示包括文件在内的所有内容 sDir Dir sPath vbDirectory Do Until LenB sDir 0 Deb
  • 第三方应用程序中是否有用于图像编辑的 iOS API?

    从iOS 8开始 图库应用程序可以使用第三方图像编辑工具来编辑照片 是否有 API 允许我自己的应用程序使用相同的第三方应用程序在我的应用程序中进行图像编辑 UIDocumentInteractionController 似乎不允许这样做
  • org.xml.sax.SAXParseException:cvc-complex-type.2.4.c:匹配通配符严格

    org xml sax SAXParseException cvc complex type 2 4 c The matching wildcard is strict but no declaration can be found for
  • 查找未执行的 C++ 代码行

    作为单元测试的一部分 我想确保测试的代码覆盖率 目的是放置类似的东西REQUIRE TEST代码中某处的宏并检查是否所有这些都被调用 void foo bool b if b REQUIRE TEST else REQUIRE TEST v
  • 为什么内置 sum 在“from numpy import *”之后表现错误?

    我有一些代码 例如 import math csv sys re time datetime pickle os gzip from numpy import x 1 2 3 y sum x 实际值的总和x为2165496761 大于32位
  • 如何获取程序文件x86环境变量?

    我想知道如何在命令提示符中显示程序文件 x86 的位置 我使用的是 Windows 7 64 位 我试过了 echo programfiles x86 and echo programfiles 这两个输出C Program Files 当
  • WPF-如何获取绑定到 ListBoxItem 的对象

    这就是我想做的 我从数据库获取对象列表并将该列表绑定到 ListBox 控件 ListBoxItems 由一个文本框和一个按钮组成 这是我想出的 到目前为止 它按预期工作 该对象有许多属性 如 ID 名称 如果我单击 ListBoxItem
  • 用户授权 Java SE

    我需要创建具有不同用户角色 管理员和简单用户 的用户授权 管理员将拥有更多的功能 那么 我应该使用哪些类或引擎来实现对我的桌面应用程序的用户授权 我应该使用类javax security auth login 在桌面应用程序中实现授权的两种
  • 将私有文件写入内部存储

    我试图在内部存储上写入一些文件 我看到了FileOutputStream fos openFileOutput FILENAME Context MODE PRIVATE on 数据存储 http developer android com
  • 如何读取文件并将其重定向到变量?

    我有一个文件 上面写着一个字 我希望我的脚本将该词放入变量中 我怎样才能做到这一点 以数百万种方式 最简单的可能是 my var cat my file 如果你使用 bash 并且想要变得更漂亮 你可以使用 bash4 的映射文件 它将整个
  • 如何让容易出错的忽略我生成的源代码?

    我最近发现容易出错 http errorprone info并使用以下命令将其集成到我的 Android 版本中Gradle插件 https github com tbroyer gradle errorprone plugin在他们的页面
  • 服务器不随 spring 应用程序启动[重复]

    这个问题在这里已经有答案了 尝试运行 Spring Temple 项目时收到此错误消息 不知道为什么 有什么建议 这是控制台的完整日志 INFO The APR based Apache Tomcat Native library whic
  • Azure-CLI/Powershell 密码要求

    所以我试图让一个变量与在 azure CLI 中创建虚拟机的密码要求相匹配 为此 它必须具有以下 3 个 大写字母 1 个小写字母 1 个特殊字符或数字 这是我试图更改的主要代码 AdminPassword Read Host Prompt
  • UIButton 在 UIScrollView 中不起作用/不可点击

    我正在使用自动布局UIScrollView Main UIView高度 1300 内容视图 内UIScrollBar UIView 1100 ConetntView 底部包含一个按钮 它是完全可见的 但当我单击它时 它不起作用 限制条件是
  • 从我的 java 代码使用基本 http 身份验证的服务器下载文件时出现问题

    我编写了以下 java 代码来从使用 http 基本身份验证的服务器下载文件 但我收到 Http 401 错误 不过 我可以通过直接从浏览器点击 URL 来下载该文件 OutputStream out null InputStream in
  • 在 Inno Setup 中检测 Java 版本

    当使用 Inno Setup 安装我的 Java 应用程序时 我希望安装程序检查是否存在 Java 7 或更高版本 并在需要时安装它 但显然 我当前的代码无法在我的一些客户的计算机上检测到 Java 8 但我无法重现该错误 你看到我可能遗漏
  • python 导入嵌套类

    我是蟒蛇新手 这不是我的实际情况 这只是我对导入嵌套类的好奇心 所以我有一个main py and test py test py class one class two def twodef pass 所以在我的main py 我可以 i
  • 有没有办法通过与另一个修饰符链接来增加可组合项的大小?

    在jetpack Compose时使用Layout or SubcomposeLayout您可以使用以下方法来衡量您的可组合项Constraints limits 如果有一个固定大小的 Modifier Modifier size 500