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,我一定是做错了什么。这两个标记显示在圆的中心,而不是圆弧的末端。我想这是因为边界尺寸被硬编码了。我会投票给你答案,因为这是朝着正确方向迈出的一步。如果你能帮我弄清楚边界的话,那就太好了。