diff --git a/app/src/main/java/sh/sar/basedbank/ui/home/CircularNavFragment.kt b/app/src/main/java/sh/sar/basedbank/ui/home/CircularNavFragment.kt index 11b34ce..cb226f0 100644 --- a/app/src/main/java/sh/sar/basedbank/ui/home/CircularNavFragment.kt +++ b/app/src/main/java/sh/sar/basedbank/ui/home/CircularNavFragment.kt @@ -316,8 +316,6 @@ class CircularWheelView @JvmOverloads constructor( val iconX = cx + cosA * (outerRadius * 0.63f) val iconY = cy + sinA * (outerRadius * 0.63f) - val textX = cx + cosA * (outerRadius * 0.84f) - val textY = cy + sinA * (outerRadius * 0.84f) // Icon — radially oriented; top items are naturally upside-down iconBitmaps.getOrNull(index)?.let { bmp -> @@ -328,12 +326,23 @@ class CircularWheelView @JvmOverloads constructor( canvas.restore() } - // Label — same radial rotation + // Curved label — same radial orientation as icons. + // In the local rotated frame the wheel arc is a circle of radius `labelRadius` + // with its centre directly "above" at (0, -labelRadius). A CCW arc through (0,0) + // flows rightward at that point, matching the natural reading direction at 6 o'clock. + val labelRadius = outerRadius * 0.84f + val textX = cx + cosA * labelRadius + val textY = cy + sinA * labelRadius + val label = items[index].label textPaint.color = labelColor + textPaint.textAlign = Paint.Align.LEFT + val halfAngleDeg = Math.toDegrees((textPaint.measureText(label) / 2.0) / labelRadius).toFloat() + val localArcRect = RectF(-labelRadius, -2f * labelRadius, labelRadius, 0f) + val arcPath = Path().apply { addArc(localArcRect, 90f + halfAngleDeg, -(halfAngleDeg * 2f)) } canvas.save() canvas.translate(textX, textY) canvas.rotate(midDeg - 90f) - canvas.drawText(items[index].label, 0f, textPaint.textSize * 0.36f, textPaint) + canvas.drawTextOnPath(label, arcPath, 0f, textPaint.textSize * 0.36f, textPaint) canvas.restore() }