Android:让用户从一个点到另一个点绘制一条线

时间:2016-12-18 15:31:29

标签: android canvas drawing geometry

我正在创建一个Android应用,其中用户可以使用平板电脑上的活动笔进行绘图和书写。 用户可以在不同的模式(例如笔,橡皮擦,线,圆......)之间进行选择,这些模式为他们提供了不同的工具 线和圆工具允许用户绘制一条线/圆,其长度/半径和方向是用户绘制的。这样做效果很好,但每次用户移动笔时,都会绘制另一条线/圆圈并填满屏幕。

图片: Current result vs. how it should be when drawing from circle center

代码:

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

@Override
protected void onDraw(Canvas c){
    c.drawBitmap(mBitmap, 0, 0, bitmapPaint);
}

private float mX, mY, firstX, firstY;

private void touch_start(float x, float y) { //called from MotionEvent.ACTION_DOWN
    path.moveTo(x, y);
    firstX = x;
    firstY = y;
    mX = x;
    mY = y;
}

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE
    path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
    switch(mode){
        case "line":
            canvas.drawLine(firstX, firstY, x, y, paint);
            break;
        case "circle":
            canvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value
            break;
        default:
            canvas.drawPath(path, paint);
            break;
    }
    mX = x;
    mY = y;
}

有谁知道如何解决这个问题? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我自己找到了一个解决方案 我创建了一个新的Canvas animationCanvas,其中包含自己的animationBitmap,用于在绘制圆圈时显示圆圈 最后一个圆圈在MotionEvent.ACTION_UP的方法中绘制。

这是新的touch_move

private void touch_move(float x, float y) { //called from MotionEvent.ACTION_MOVE
    path.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
    switch(mode){
        case "line":
            animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn line (for animation)
            animationCanvas.drawLine(firstX, firstY, x, y, paint);
            break;
        case "circle":
            animationCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); // clear previously drawn circle (for animation)
            animationCanvas.drawCircle(firstX, firstY, (Math.abs(firstX-x) + Math.abs(firstY-y))/1.5f, paint); // divisor 1.5 just a rough value 
            break;
        default:
            canvas.drawPath(path, paint);
            break;
    }    
    mX = x;
    mY = y;
}

也许不是最好的解决方案,但它有效:)