You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Compose:绘制透明矩形分割Box时旋转后高度异常问题

问题分析

你遇到的核心问题是旋转后的矩形尺寸不足以覆盖Box的完整高度,再加上旋转中心点和初始位置的设置,导致视觉上没法填满Box上下边缘。

当你把高度等于Box高度的矩形旋转35°时,这个矩形在垂直方向的有效覆盖长度会变成原高度乘以cos(35°)(三角函数投影原理),自然比Box实际高度短,所以上下会留空。另外,你以原始矩形的中心为旋转轴,旋转后矩形的上下两端会向内收缩,进一步导致顶部和底部无法贴合Box边缘。

解决方案

调整矩形的初始尺寸和位置,让旋转后的矩形能完全贯穿Box的上下。具体修改如下:

Box(
    modifier = Modifier
        .height(35.dp)
        .fillMaxWidth()
        .clip(shape = RoundedCornerShape(8.dp))
        .drawWithLayer {
            drawContent()
            // 计算旋转后能覆盖Box高度的矩形所需高度:原高度 / cos(35°)
            val requiredHeight = size.height / kotlin.math.cos(Math.toRadians(35.0)).toFloat()
            val rect = Rect(
                offset = Offset(
                    x = size.width / 2f,
                    // 向上偏移,让旋转后的矩形顶部对齐Box顶部
                    y = (size.height - requiredHeight) / 2f
                ),
                size = Size(width = 10.dp.value, height = requiredHeight),
            )
            rotate(
                degrees = 35F,
                pivot = Offset(size.width / 2f, size.height / 2f) // 以Box中心为旋转轴,保证分割线居中
            ) {
                drawRect(
                    blendMode = BlendMode.SrcOut,
                    color = Color.Transparent,
                    topLeft = rect.topLeft,
                    size = rect.size,
                )
            }
        }
) {
    // Box内部内容
}
关键调整说明
  • 计算所需高度:通过size.height / cos(35°)得到的矩形高度,旋转后在垂直方向的投影刚好等于Box高度,确保能完全覆盖上下边缘
  • 调整Y轴偏移:把矩形向上偏移(size.height - requiredHeight)/2,让旋转后的矩形顶部对齐Box顶部、底部对齐Box底部
  • 旋转轴心改为Box中心:保证旋转后的分割线始终处于Box的水平中心位置,不会偏移

调试时可以先把color改成黑色,确认矩形完全覆盖后再换回透明色,这样更容易观察效果。

内容的提问来源于stack exchange,提问作者Funnycuni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 01:03:37