Android Canvas如何在圆弧末端绘制小圆(实现太阳角度效果)
Android Canvas 圆弧末端绘制小圆解决方案
要获取圆弧末端的坐标,核心是通过三角函数计算结合Canvas圆弧参数推导位置,以下是具体实现步骤和代码:
关键计算逻辑
Android Canvas以3点钟方向为0°,角度顺时针递增。推导圆弧末端坐标只需以下几步:
- 确定圆弧核心参数:圆心坐标
(centerX, centerY)、圆弧半径arcRadius、起始角度startAngle(角度制)、扫过角度sweepAngle(角度制) - 计算圆弧末端绝对角度:
endAngle = startAngle + sweepAngle - 将角度转换为弧度:
endRadian = Math.toRadians(endAngle) - 推导末端点坐标:
float endX = centerX + arcRadius * (float) Math.cos(endRadian); float endY = centerY + arcRadius * (float) Math.sin(endRadian);
完整代码示例(自定义View)
public class SunAngleView extends View { private Paint arcPaint; private Paint dotPaint; // 圆弧参数 private float centerX; private float centerY; private float arcRadius = 150f; private float startAngle = 0f; // 从0°(3点钟方向)开始 private float sweepAngle = 135f; // 扫过角度,对应需求效果 public SunAngleView(Context context) { super(context); initPaints(); } public SunAngleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); initPaints(); } private void initPaints() { // 圆弧画笔 arcPaint = new Paint(); arcPaint.setColor(Color.parseColor("#FDB813")); arcPaint.setStrokeWidth(12f); arcPaint.setStyle(Paint.Style.STROKE); arcPaint.setAntiAlias(true); // 末端小圆画笔 dotPaint = new Paint(); dotPaint.setColor(Color.parseColor("#FDB813")); dotPaint.setStyle(Paint.Style.FILL); dotPaint.setAntiAlias(true); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 圆心设为View中心 centerX = w / 2f; centerY = h / 2f; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制圆弧 RectF arcRect = new RectF(centerX - arcRadius, centerY - arcRadius, centerX + arcRadius, centerY + arcRadius); canvas.drawArc(arcRect, startAngle, sweepAngle, false, arcPaint); // 计算圆弧末端坐标 float endAngle = startAngle + sweepAngle; float endRadian = (float) Math.toRadians(endAngle); float endX = centerX + arcRadius * (float) Math.cos(endRadian); float endY = centerY + arcRadius * (float) Math.sin(endRadian); // 绘制末端小圆(半径设为圆弧线宽的1.5倍,适配视觉效果) float dotRadius = arcPaint.getStrokeWidth() * 1.5f; canvas.drawCircle(endX, endY, dotRadius, dotPaint); } }
注意事项
- 若起始角度不是0°,只需调整
startAngle参数,计算逻辑通用 - 末端小圆半径可根据视觉需求自定义,示例中用圆弧线宽的1.5倍保证协调
- 动态更新角度时,修改
sweepAngle后调用invalidate()即可触发重绘
内容的提问来源于stack exchange,提问作者MR AD
相关产品推荐
相关产品推荐

