[英]How to draw line path on top of arc using Canvas paint in Android
[英]Canvas draw path with dynamic paint color
我正在为Arduino电机护罩编写Android应用程序(实际上是Nucleo板,但这并不重要),并且我将超声波声纳传感器测得的距离显示为屏幕上的点。 在Arduino的每次更新中(我发送了一个带有伺服角度和声纳距离(以厘米为单位)的数据包),我绘制了一个新的Point。 问题是,有时对于相同的伺服角度,我有许多声纳距离,如果我全部绘制它们,会变得混乱。
对于每个伺服角度(X轴),我只想绘制声纳距离(Y轴)的最新测量值。
这是具有相同伺服角度的许多点的图。
这是我用来在视图画布上绘制所有传入点的代码: https : //github.com/dizcza/FunduMotoJoystick/blob/b224e80d59fe11c0252dce7f78aca995f67a7d65/app/src/main/java/de/kai_morich/fundu_moto_joystick/SonarView。
public class SonarView extends View {
private static final int POINT_RADIUS = 10;
private final Paint mPaint = new Paint();
private final Path mPath = new Path();
public SonarView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.BLACK);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(mPath, mPaint);
}
public void drawCircle(float x, float y) {
mPath.addCircle(x, y, POINT_RADIUS, Path.Direction.CW);
invalidate();
}
public void clear() {
mPath.reset();
}
}
我之所以称其为“具有动态绘画颜色的画布绘制路径”,是因为如果我可以为路径中每个添加的项目(圆形)显式提供颜色,则每次都会绘制一个白色矩形以覆盖每个新点下方的空间。
创建一个方法,将油漆对象返回为
public Paint getCustomPaint(int color){
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(color);
return paint;
}
并将其称为canvas.drawPath(mPath, getCustomPaint(randomColor));
编辑:
根据您的要求,您需要维护一个ArrayList(在其顶部添加),如下所示:
private ArrayList<Point> mPointsList = new ArrayList<>();
private ArrayList<Point> mWhitePointsList = new ArrayList<>();
private final Path mWhitePath = new Path();
然后添加一个新方法,
private boolean isPointPresent(float x, float y) {
Point lPoint = new Point((int)x, (int)y);
boolean isFound = false;
for (Point point : mPointsList){
if(point.x == x){
isFound = true;
mPointsList.remove(point);
mWhitePointsList.add(point);
}
}
if(isFound) {
mPointsList.add(lPoint);
return true;
}
mPointsList.add(lPoint);
return false;
}
同样,在drawCircle方法中进行如下更改:
public void drawCircle(float x, float y) {
if(isPointPresent(x, y)) {
for(Point point : mWhitePointsList){
mWhitePath.addCircle(point.x, point.y, POINT_RADIUS, Path.Direction.CW );
mWhitePointsList.remove(point);
}
}
mPath.addCircle(x, y, POINT_RADIUS, Path.Direction.CW);
invalidate();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.