画布以动态油漆颜色绘制路径

时间:2019-07-14 17:21:32

标签: android canvas

我正在为Arduino电机护罩(实际上是Nucleo板,但没关系)编写Android应用,并且我将超声声纳传感器测得的距离显示为屏幕上的点。在Arduino的每次更新中(我发送了一个带有伺服角度和声纳距离(以厘米为单位)的数据包),我绘制了一个新的Point。问题是,有时对于相同的伺服角度,我有许多声纳距离,如果我全部绘制它们,会变得混乱。

对于每个伺服角度(X轴),我只想绘制声纳距离(Y轴)的最新测量值。

这是在相同伺服角度下具有许多点的图。

这是我用来在视图的画布上绘制所有传入点的代码:https://github.com/dizcza/FunduMotoJoystick/blob/b224e80d59fe11c0252dce7f78aca995f67a7d65/app/src/main/java/de/kai_morich/fundu_moto_joystick/SonarView.java

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();
    }
}

我将主题称为“具有动态绘画颜色的画布绘制路径”,因为如果我可以为路径中每个添加的项目(圆形)明确提供颜色,则每次都将绘制一个白色矩形以覆盖每个下方的空间新点。

1 个答案:

答案 0 :(得分:1)

创建一个将绘画对象返回为

的方法
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();
}