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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:15:45