canvas.drawPath()不是实时绘图

时间:2018-05-11 23:14:34

标签: android canvas

在此图库here的基础上,图书馆没有提供改变单个笔画颜色或宽度的方法,但只是同时改变了所有画笔笔画的属性。所以我决定用自己的属性分隔每个笔画。然而,现在当在屏幕上移动手指时,绘图笔划不会实时出现。整个笔画仅出现在touch_up()函数上。我假设问题来自canvas.drawPath(myPath, myPaint);函数中的onDraw(),但我找不到导致问题的原因。有谁知道笔画实时绘制的问题是什么?或者如何解决它?

DrawingView.java:

public class DrawingView extends View {
    private Paint canvasPaint;
    private Canvas drawCanvas;
    private Bitmap canvasBitmap;
    private ArrayList<Path> paths = new ArrayList<Path>();
    private ArrayList<Path> undonePaths = new ArrayList<Path>();
    private ArrayList<float[]> PointsCal = new ArrayList<float[]>();
    private ArrayList<float[]> Points = new ArrayList<float[]>();
    private ArrayList<Integer> id = new ArrayList<Integer>();
    private int counter;
    public static WebSocket ws;
    private OkHttpClient client;
    Context myContext;
    Stroke drawnStroke;
    private List<Stroke> allStrokes;

public DrawingView(Context context, AttributeSet attr) {
    super(context, attr);
    setupDrawing();
    myContext = context;
}

private void setupDrawing() {
    allStrokes = new ArrayList<Stroke>();
    drawnStroke = new Stroke();

    canvasPaint = new Paint(Paint.DITHER_FLAG);
    drawCanvas = new Canvas();
    drawnStroke.paint.setAntiAlias(true);

    drawnStroke.paint.setStyle(Paint.Style.STROKE);
    drawnStroke.paint.setStrokeJoin(Paint.Join.ROUND);
    drawnStroke.paint.setStrokeCap(Paint.Cap.ROUND);
    counter = 0;
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    super.onSizeChanged(w, h, oldw, oldh);
    canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    drawCanvas = new Canvas(canvasBitmap);
}

@Override
protected void onDraw(Canvas canvas) {

    if (allStrokes != null) {
        for (Stroke stroke : allStrokes) {
            if (stroke != null) {
                Path myPath = stroke.getPath();
                Paint myPaint = stroke.getPaint();

                myPaint.setAntiAlias(true);
                myPaint.setStyle(Paint.Style.STROKE);

                //this function below is not rendering in real time
                canvas.drawPath(myPath, myPaint);

            }
        }
    }
}

private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;

private void touch_start(float x, float y) {
    drawnStroke.getPaint().setColor(UserSettings.color);
    drawnStroke.getPaint().setStrokeWidth(UserSettings.width);
    drawnStroke.getPath().moveTo(x, y);
    mX = x;
    mY = y;
}


private void touch_move(float x, float y) {
    float dx = Math.abs(x - mX);
    float dy = Math.abs(y - mY);
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
        drawnStroke.path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mX = x;
        mY = y;
    }
}


private void touch_up() {
    drawnStroke.path.lineTo(mX, mY);
    drawCanvas.drawPath(drawnStroke.path, drawnStroke.paint);
    allStrokes.add(drawnStroke);
    drawnStroke = new Stroke();
}


@Override
public boolean onTouchEvent(MotionEvent event) {
    float x = event.getX();
    float y = event.getY();
    float coordinates[] = {0f, 0f};
    float coord[] = {0f, 0f};
    String eventString;

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touch_start(x, y);
            coordinates[0] = x;
            coordinates[1] = y;
            PointsCal.add(coordinates);
            Points.add(coordinates);
            invalidate();
            break;

        case MotionEvent.ACTION_MOVE:
            touch_move(x, y);
            coordinates[0] = x;
            coordinates[1] = y;
            PointsCal.add(coordinates);
            coord[0] = coordinates[0] - PointsCal.get(PointsCal.size() - 2)[0];
            coord[1] = coordinates[1] - PointsCal.get(PointsCal.size() - 2)[1];
            Points.add(coord);
            break;

        case MotionEvent.ACTION_UP:
            touch_up();
            coordinates[0] = x;
            coordinates[1] = y;
            PointsCal.add(coordinates);
            coord[0] = coordinates[0] - PointsCal.get(PointsCal.size() - 2)[0];
            coord[1] = coordinates[1] - PointsCal.get(PointsCal.size() - 2)[1];
            Points.add(coord);
            String sample = "";
            if (Points.size() > 2) {
                counter++;
                id.add(counter);
                sample += ("#" + counter);
                for (int i = 0; i < Points.size(); i++) {
                    sample += ("#" + Arrays.toString(Points.get(i)));
                }
            } else {
                paths.remove(paths.size() - 1);
            }
            Points.clear();
            PointsCal.clear();
            invalidate();
            break;
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

我认为这是因为在调用私有方法allStrokes.add(drawnStroke);之前不会调用touch_up,所以当为了绘图目的迭代allStrokes时,省略当前笔划。尝试将该行代码移至touch_start