Android onDraw仅在第二次绘图时进行更改

时间:2014-12-22 03:40:18

标签: android draw

我正在为我的应用程序开发绘图模块。所有功能都运行良好。问题是,每当我更改颜色,或者设置brushSize或更改为橡皮擦时,屏幕上的第一次触摸将使用之前的设置进行绘制。然后第二次触摸将有最新的变化。同样可以撤消。第一次点击没有任何变化。对于第二次点击等,它工作正常。这是我reference。参考中的示例应用程序也存在同样的问题。这是我的代码:

public class DrawingView extends View {



//drawing path
private Path drawPath;
private Point pointDraw;
//drawing and canvas paint
private Paint drawPaint, canvasPaint;
//initial color
private int paintColor;
//canvas
private Canvas drawCanvas;
//canvas bitmap
private Bitmap canvasBitmap;
//brush sizes
private float brushSize, lastBrushSize;
//private int defaultBrush = 10;
//erase flag
private boolean erase=false;
private int tempColor;
private boolean checkDraw = false;
private ArrayList<PathPoints> paths = new ArrayList<PathPoints>();
private ArrayList<PathPoints> undonePaths = new ArrayList<PathPoints>();
private ArrayList<Point> tempCanvas = new ArrayList<Point>();
private int countPoint = 0;
int x,y;

public DrawingView(Context context, AttributeSet attrs){
    super(context, attrs);
    setupDrawing();
}

//setup drawing
private void setupDrawing(){

    //prepare for drawing and setup paint stroke properties
    //brushSize = getResources().getInteger(R.integer.medium_size);
    lastBrushSize = brushSize;
    drawPath = new Path();
    drawPaint = new Paint();
    drawPaint.setColor(paintColor);
    drawPaint.setAntiAlias(true);
    drawPaint.setStrokeWidth(brushSize);
    drawPaint.setStyle(Paint.Style.STROKE);
    drawPaint.setStrokeJoin(Paint.Join.ROUND);
    drawPaint.setStrokeCap(Paint.Cap.ROUND);
    canvasPaint = new Paint(Paint.DITHER_FLAG);


    paths.add(new PathPoints(drawPath, paintColor, brushSize, false));
    drawCanvas = new Canvas();
}

//size assigned to view
@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);

}

//draw the view - will be called after touch event
@Override
protected void onDraw(Canvas canvas) {
     super.onDraw(canvas);
    //canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    //canvas.drawPath(drawPath, drawPaint);

    for (PathPoints p : paths) {
        drawPaint.setColor(p.getColor());
        drawPaint.setStrokeWidth(p.getStrokeSize());
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(p.getPath(), drawPaint);

    }
    setCheckDraw(true);
}


public int getArr()
{
    return paths.size();
}

public boolean isCheckDraw() {
    return checkDraw;
}

public void setCheckDraw(boolean checkDraw) {
    this.checkDraw = checkDraw;
}

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

private void touch_start(float x, float y) {
    drawPath.reset();
    drawPath.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) {
        drawPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
        mX = x;
        mY = y;
    }
}

private void touch_up() {
    drawPath.lineTo(mX, mY);
    // commit the path to our offscreen
    drawCanvas.drawPath(drawPath, drawPaint);
    // kill this so we don't double draw
    drawPath = new Path();
    paths.add(new PathPoints(drawPath, paintColor, brushSize, false));

}

//register user touches as drawing action
@Override
public boolean onTouchEvent(MotionEvent event) {
    float touchX = event.getX();
    float touchY = event.getY();
    //respond to down, move and up events

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:

            touch_start(touchX, touchY);
            invalidate();

        break;
    case MotionEvent.ACTION_MOVE:

            touch_move(touchX, touchY);

        break;
    case MotionEvent.ACTION_UP:

            touch_up();
            //invalidate();

        break;
    }
    //redraw
    invalidate();//do not call frequently
    return true;
}

public void validateDraw()
{
    invalidate();
}


//update color
public void setColor(String newColor){
    //invalidate();
    paintColor = Color.parseColor(newColor);
    drawPaint.setColor(paintColor);
}

public void setColor(int newColor){
    //invalidate();
    paintColor = newColor;
    drawPaint.setColor(paintColor);
    tempColor = paintColor;
}

//set brush size
public void setBrushSize(float newSize){
    float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
            newSize, getResources().getDisplayMetrics());
    brushSize=pixelAmount;
}

//get and set last brush size
public void setLastBrushSize(float lastSize){
    lastBrushSize=lastSize;
}
public float getLastBrushSize(){
    drawPath.reset();
    return lastBrushSize;
}

//set erase true or false

public void setErase(boolean isErase)
{
    //drawPath.reset();
    erase=isErase;
    if(erase)
        this.setColor("#FFFFFFFF");
    else
        //drawPaint.setXfermode(null);
        this.setColor(tempColor);
}



//// new drawing
public void startNew(){
    //drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
    paths.clear();
    undonePaths.clear();
    invalidate();
}


public void onClickUndo() {
    if (paths.size() > 0) {
        undonePaths.add(paths.remove(paths.size() - 1));
        invalidate();
    } else {

    }

    // toast the user
}

public void onClickRedo() {
    if (undonePaths.size() > 0) {
        paths.add(undonePaths.remove(undonePaths.size() - 1));
        invalidate();
    } else {

    }
    // toast the user
}

提前感谢

0 个答案:

没有答案