android绘图应用程序行一旦改变颜色所有以前绘制的线条都涂上了新的颜色

时间:2013-02-21 12:26:36

标签: android canvas paint

我正在制作一个绘图应用程序并且下面的代码工作正常,但是当我想要更改绘制线的颜色时,绘制的所有上一行都将更改为新颜色:

    private Bitmap bitmap; // drawing area for display or saving
    private Canvas bitmapCanvas; // used to draw on bitmap
    private Paint paintLine; // used to draw lines onto bitmap   
    private Path mPath; 
    private ArrayList<Path> paths = new ArrayList<Path>();
    private ArrayList<Path> undonePaths = new ArrayList<Path>();
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;    

    // DoodleView constructor initializes the DoodleView

    public DoodleView(Context context, AttributeSet attrs) 
    {
       super(context, attrs); // pass context to View's constructor
       this.context_new=context;
       setFocusable(true);
       setFocusableInTouchMode(true);      

       // set the initial display settings for the painted line
       paintLine = new Paint();
       paintLine.setAntiAlias(true); // smooth edges of drawn line
       paintLine.setDither(true);
       paintLine.setColor(Color.BLACK); // default color is black
       paintLine.setStyle(Paint.Style.STROKE); // solid line
       paintLine.setStrokeJoin(Paint.Join.ROUND);
       paintLine.setStrokeWidth(5); // set the default line width
       paintLine.setStrokeCap(Paint.Cap.ROUND); // rounded line ends

       bitmapCanvas = new Canvas();
       mPath = new Path();            
     } // end DoodleView constructor

     // Method onSizeChanged creates BitMap and Canvas after app displays

     @Override
     public void onSizeChanged(int w, int h, int oldW, int oldH)
     {
        super.onSizeChanged(w, h, oldW, oldH);
        DoodlzViewWidth = w;       
        DoodlzViewHeight = h;           
     } 

     @Override

     protected void onDraw(Canvas canvas) 
     {         
       for (Path p : paths){canvas.drawPath(p, paintLine);}  
       canvas.drawPath(mPath, paintLine);
       Log.i("OnDRAWING", "REACH ON DRAW");        
    } 

  // START TOUCH: handle touch event
     @Override

     public boolean onTouchEvent(MotionEvent event) 
     {            
          float x = event.getX();
          float y = event.getY();

          switch (event.getAction())
          {
              case MotionEvent.ACTION_DOWN:
                  touch_start(x, y);
                  invalidate();
                  break;
              case MotionEvent.ACTION_MOVE:
                 touch_move(x, y);
                  invalidate();
                  break;
              case MotionEvent.ACTION_UP:
                  touch_up();
                  invalidate();
                  break;
          }
          return true;
    }

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

    private void touch_up() 
    {
        mPath.lineTo(mX, mY);      
        bitmapCanvas.drawPath(mPath, paintLine);// commit the path to our offscreen  
        paths.add(mPath);
        mPath = new Path(); 
    }

    public void onClickUndo() 
    { 
       if (paths.size()>0) 
        { 
           undonePaths.add(paths.remove(paths.size()-1));
           invalidate();
        }      
       else Toast.makeText(getContext(), "nothing more to undo", Toast.LENGTH_SHORT).show();  
    }

setDrawingColor:

   public void setDrawingColor(int color) // set the painted line's color 
   {       
       paintLine.setColor(color);
   } 

如何修改上述代码,使前一行修复为原始颜色?谢谢!!

3 个答案:

答案 0 :(得分:1)

您需要跟踪路径颜色,并在onDraw中恢复最初用于绘制路径的颜色。

 protected void onDraw(Canvas canvas) 
 {          
   for (Path p : paths){canvas.drawPath(p, paintLine);}  
   paintLine.setColor(restoreColorForPath(p));
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
} 

您只需要实施restoreColorForPath,它就是部分storeColorForPath(path,color)(可能是简单的Map

这个类似的问题可以帮助您:How to draw the multiple lines with different color and undo,redo the paths in android?

答案 1 :(得分:0)

protected void onDraw(Canvas canvas) 
 {         
   for (Path p : paths){canvas.drawPath(p, paintLine);}  
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
} 

尝试此代码而不是上面的

protected void onDraw(Canvas canvas) 
 {         
   canvas.drawBitmap(bitmapCanvas, 0,0,paintLine);
   canvas.drawPath(mPath, paintLine);
   Log.i("OnDRAWING", "REACH ON DRAW");        
}

答案 2 :(得分:0)

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    for (int i = 0; i < position1.size(); i += 2) {
        float x1 = position1.get(i);
        float y1 = position1.get(i + 1);
        float x2 = position2.get(i);
        float y2 = position2.get(i + 1);

        Paint paint = new Paint();
        if(words[a].getMEANING().equals(s2[b])){
            paint.setPathEffect(new CornerPathEffect(10));
            paint.setColor(Color.GREEN);
            paint.setStrokeWidth(13);
            paints.add(paint);
        }else{
            paint.setPathEffect(new CornerPathEffect(10));
            paint.setColor(Color.RED);
            paint.setStrokeWidth(13);
            paints.add(paint);

        }



        canvas.drawLine(x1,y1, x2,y2, paints.get(i));
    }
}