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

Jetpack Compose中圆弧正确旋转角度计算故障排查

圆弧旋转定位偏差问题(无焦点初始状态)

当前状态

我正在开发一款圆形圆弧展示应用:

  • 初始为中心圆,包含6个圆弧
    含6个圆弧的中心圆
  • 点击任一圆弧,所有圆弧会旋转至被点击圆弧位于底部(90度位置),同时弹出包含8个圆弧的第二层
    含8个圆弧的第二层
  • 点击第二层圆弧时,该层执行同样旋转操作;当圆弧处于焦点状态(90度在其边界内)时,会缩放且扫掠角度与内层圆弧一致
    被点击圆弧处于焦点,扫掠角度与内层圆弧一致

由于焦点圆弧会“变宽”,其他圆弧会相应缩小:

  • 无焦点时单圆弧宽度:360/8 = 45°
  • 焦点圆弧宽度:60°
  • 非焦点圆弧宽度:≈42.86°

当已有焦点圆弧时,旋转角度计算逻辑运行正常:

fullAngle = 360
rotation=当前图层已有的旋转偏移量
arc=被点击的圆弧
...
        val currentMiddleAngle = getCenteredAngleOfCurrentItem(arc, rotation, fullAngle)
        var angleToRotate = 0f;
        if (isItemCenterInLeftTopAndBottomQuarter(currentMiddleAngle)) {
            angleToRotate = currentMiddleAngle - 90f
        } else if (isItemCenterInRightTopQuarter(currentMiddleAngle, fullAngle)) {
            angleToRotate = fullAngle - currentMiddleAngle + 90
        } else if (isItemInRightBottomQuarter(currentMiddleAngle)) {
            angleToRotate = 90 - currentMiddleAngle
        }
        return angleToRotate
...
private fun getCenteredAngleOfCurrentItem(
        arc: PieChartInput,
        rotation: Float,
        fullAngle: Float
    ): Float {
        val middleOfItemAngel = arc.angleToDraw / 2
        val currentMiddleAngle =
            (arc.currentStartAngle + rotation + middleOfItemAngel).mod(fullAngle)
        return currentMiddleAngle
    }

逻辑规则:圆弧在右半圈时顺时针旋转,否则逆时针旋转。

问题

第二层首次展开时(无圆弧被选中,符合预期),点击任一圆弧后,该圆弧应移动至底部中心(90度位置),但无论怎么调整计算方式,始终存在定位偏差,无法精准到位。

点击右侧圆弧的测试效果(标注数字便于识别):
点击前 点击第二个圆弧后

观察发现:被点击圆弧距离90度越远,偏移量越大,左侧圆弧也存在相同问题。

我尝试过补全选中与未选中圆弧的宽度差值,但仅对单个圆弧有效,其他圆弧仍偏移错误。肯定有个简单的计算公式,但折腾好几天还是没找到正确解法。

更新
旋转方向影响圆弧扩展逻辑:

  • 顺时针旋转时,选中圆弧顺时针扩展:起始角度不变,仅调整结束角度
  • 逆时针旋转时,选中圆弧逆时针扩展

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:25:03