Java Android将线标记添加到圆弧的边缘

Java Android将线标记添加到圆弧的边缘,java,android,math,android-canvas,wear-os,Java,Android,Math,Android Canvas,Wear Os,如何在弧的边缘添加线标记 我们知道可以使用以下方法绘制弧: canvas.drawArc(arcBounds, 0, 90, false, paint); canvas.drawCircle(endX, endY, 5, timeArcPaints); 上述语句将在下午3点到6点绘制一个弧。我想在弧的两侧添加线标记,如下图所示 我可以使用以下方法在两条边上绘制圆: canvas.drawArc(arcBounds, 0, 90, false, paint); canvas.drawCir

如何在
的边缘添加
线
标记

我们知道可以使用以下方法绘制

canvas.drawArc(arcBounds, 0, 90, false, paint);
canvas.drawCircle(endX, endY, 5, timeArcPaints);
上述语句将在下午3点到6点绘制一个
弧。我想在
的两侧添加
线
标记,如下图所示

我可以使用以下方法在两条边上绘制圆:

canvas.drawArc(arcBounds, 0, 90, false, paint);
canvas.drawCircle(endX, endY, 5, timeArcPaints);
我有
startX
startY
endX
endY
位置用于
,但是我不确定如何绘制
线
标记,使其与
端点处于同一角度

public void drawLine (float startX, 
                float startY, 
                float stopX, 
                float stopY, 
                Paint paint)

谢谢

在android paint中保存如何绘制视图的样式和颜色信息。您需要使用paint style来实现所需的绘制

为标记创建绘制

 private Paint createMarkerPaint(){
    Paint p = new Paint();
    p.setAntiAlias(true);
    p.setDither(true);
    p.setColor(Color.RED);
    p.setStyle(Paint.Style.FILL_AND_STROKE);
    p.setStrokeWidth(20);
    p.setStrokeCap(Paint.Cap.ROUND); // makes the stroke projects out as semicircle
    p.setStrokeJoin(Paint.Join.ROUND); // makes outer edges of a join meet in circular arc
    return p;
}
使用此功能可以创建线标记

 private void drawLineMarkers(Canvas c, float startX, float startY, float endX, float endY){

    int lineHeight = 20; // play with it
    int lineWidth = 20; // play with it
    c.drawLine(startX, startY, startX - lineWidth, startY - lineHeight, markerPaint);
    c.drawLine(startX, startY, startX + lineWidth, startY + lineHeight, markerPaint);

    c.drawLine(endX, endY, endX - lineWidth, endY - lineHeight, markerPaint);
    c.drawLine(endX, endY, endX + lineWidth, endY + lineHeight, markerPaint);

}
自定义视图的代码

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.View;

public class MarkerView extends View {

    private final Paint markerPaint;
    private RectF oval;
    private final int boundingRectDimens = 200;
    private int centerX;
    private int centerY;

    private final float startAngle = 190;
    private final float sweepAngle = 90;
    private final float markerAngle = 180; // angle of markers w.r.t start point and end/sweep point


    public MarkerView(Context context) {
        super(context);
        markerPaint = createMarkerPaint();

    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        centerX = w / 2;
        centerY = h / 2;
        oval = new RectF(centerX - boundingRectDimens,
                centerY - boundingRectDimens,
                centerX + boundingRectDimens,
                centerY + boundingRectDimens);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.DKGRAY);
        canvas.drawArc(oval, startAngle, sweepAngle, false, markerPaint);


        float startX, startY, endX, endY;
        // calculate start points.

        //get a line from startAngle till markerAngle.
        startX = (float) (Math.cos(Math.toRadians(startAngle)) * boundingRectDimens + centerX);
        startY = (float) (Math.sin(Math.toRadians(startAngle)) * boundingRectDimens + centerY);
        endX = (float) (Math.cos(Math.toRadians(startAngle + markerAngle)) * boundingRectDimens + centerX);
        endY = (float) (Math.sin(Math.toRadians(startAngle + markerAngle)) * boundingRectDimens + centerY);

        // we need to draw only a part of the entire line, using vector for this.
        // vector dimens.
        float desiredLen = 0.05f;  // maker height can be adjusted by changing this value.
        float upLen = 1 - desiredLen;
        float downLen = 1 + desiredLen;
        // calculate down vector.
        float desiredX = downLen * (startX - endX) + endX;
        float desiredY = downLen * (startY - endY) + endY;

        markerPaint.setColor(Color.YELLOW);
        canvas.drawLine(startX, startY, desiredX, desiredY, markerPaint);
        // get up vector
        desiredX = upLen * (startX - endX) + endX;
        desiredY = upLen * (startY - endY) + endY;
        canvas.drawLine(startX, startY, desiredX, desiredY, markerPaint);


        // repeat same for end/sweep point.
        startX = (float) (Math.cos(Math.toRadians(startAngle + sweepAngle)) * boundingRectDimens + centerX);
        startY = (float) (Math.sin(Math.toRadians(startAngle + sweepAngle)) * boundingRectDimens + centerY);
        endX = (float) (Math.cos(Math.toRadians(startAngle + sweepAngle + markerAngle)) * boundingRectDimens + centerX);
        endY = (float) (Math.sin(Math.toRadians(startAngle + sweepAngle + markerAngle)) * boundingRectDimens + centerY);

        // calculate down vector.
        desiredX = downLen * (startX - endX) + endX;
        desiredY = downLen * (startY - endY) + endY;

        markerPaint.setColor(Color.BLUE);
        canvas.drawLine(startX, startY, desiredX, desiredY, markerPaint);
        // get up vector
        desiredX = upLen * (startX - endX) + endX;
        desiredY = upLen * (startY - endY) + endY;
        canvas.drawLine(startX, startY, desiredX, desiredY, markerPaint);


    }


    private Paint createMarkerPaint() {
        Paint p = new Paint();
        p.setAntiAlias(true);
        p.setDither(true);
        p.setColor(Color.RED);
        p.setStyle(Paint.Style.STROKE);
        p.setStrokeWidth(20);
        p.setStrokeCap(Paint.Cap.ROUND); // makes the stroke projects out as semicircle
        p.setStrokeJoin(Paint.Join.ROUND); // makes outer edges of a join meet in circular arc
        return p;
    }
}

我很抱歉。我的问题是如何在适当的平面上找到绘制线。您想知道如何计算drawLineMarkers()中使用的点(startX、startY、endX、endY)。是的。我已经实现了这个解决方案,但是由于实验的原因它不干净,我会清理它,添加支持文档,然后明天发布答案。标记是什么?可以根据用户输入以任何角度绘制圆弧,因此如何确保标记角有效?标记角是标记和要绘制标记的圆弧点之间的角度。在165到195的范围内看起来不错,你可以用不同的值来玩,并决定你自己的最佳值。如果你想让marker保持直线,保持markerAngle在180Hmm,我一定是做错了什么。这两个标记显示在圆的中心,而不是圆弧的末端。我想这是因为边界尺寸被硬编码了。我会投票给你答案,因为这是朝着正确方向迈出的一步。如果你能帮我弄清楚边界的话,那就太好了。