gpt4 book ai didi

java - Android Canvas 检查点是否在线

转载 作者:行者123 更新时间:2023-11-29 05:38:50 25 4
gpt4 key购买 nike

我有一个自定义 View ,它绘制线条并将它们保存到 ArrayList。我想要做的是检查指定点是否在 Arraylist 内的一行上并返回该行。当线是直线时,我已经能够通过使用 if (l.startX == l.stopX && l.startY < l.stopY 做到这一点。但如果这条线是在一个角度上,这就不起作用了。我还想用 drawText 和 drawCircle 来做到这一点。是否有一些我错过的简单方法可以做到这一点?

绘图 View .java

class Line {
float startX, startY, stopX, stopY;
public Line(float startX, float startY, float stopX, float stopY) {
this.startX = startX;
this.startY = startY;
this.stopX = stopX;
this.stopY = stopY;
}
public Line(float startX, float startY) { // for convenience
this(startX, startY, startX, startY);
}
}

public class DrawView extends View {
Paint paint = new Paint();
ArrayList<Line> lines = new ArrayList<Line>();

public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);

paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.BLACK);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}

@Override
protected void onDraw(Canvas canvas) {
for (Line l : lines) {
canvas.drawLine(l.startX, l.startY, l.stopX, l.stopY, paint);
}
}

@Override
public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
lines.add(new Line(event.getX(), event.getY()));
return true;
}
else if ((event.getAction() == MotionEvent.ACTION_MOVE ||
event.getAction() == MotionEvent.ACTION_UP) &&
lines.size() > 0) {
Line current = lines.get(lines.size() - 1);
current.stopX = event.getX();
current.stopY = event.getY();
Invalidate();
return true;
}
else {
return false;
}
}
}

最佳答案

我不知道是否有用于此的 Canvas 库,但您可以手动:

  1. 查看你的行列表
  2. 假设每条直线的方程式为斜截式 y = mx + b
  3. 将 event.X() 和 event.Y() 插入到上面的等式中,作为每一行的 x 和 y
  4. 如果两条边相等,那么你的触摸事件就在那条线上

关于java - Android Canvas 检查点是否在线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com