Jetpack Compose中圆弧正确旋转角度计算故障排查
圆弧旋转定位偏差问题(无焦点初始状态)
当前状态
我正在开发一款圆形圆弧展示应用:
- 初始为中心圆,包含6个圆弧

- 点击任一圆弧,所有圆弧会旋转至被点击圆弧位于底部(90度位置),同时弹出包含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
相关产品推荐
相关产品推荐

