2017-09-25 100 views
2

我正在使用这个类来绘制像多色的笔工具它工作的很好,但是当我改变颜色时,它不会在选择颜色之间改变颜色。我检查并尝试了许多解决方案,但他们没有任何解决方案。用多种颜色绘制线条的问题android

public class DrawingView extends View { 
private static final float TOUCH_TOLERANCE = 4; 
Paint mPaint; 
//MaskFilter mEmboss; 
//MaskFilter mBlur; 
Bitmap mBitmap; 
Canvas mCanvas; 
Path mPath; 
Paint mBitmapPaint; 
ProgressDialog pd; 
String color; 
private ArrayList<Path> paths = new ArrayList<Path>(); 
private ArrayList<Paint> paints = new ArrayList<Paint>(); 
private ArrayList<Integer> colorlist = new ArrayList<Integer>(); 
private float mX, mY; 

public DrawingView(Context context, String color) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(10); 
    pd = new ProgressDialog(context); 
    mPath = new Path(); 
    paths.add(mPath); 
    mBitmapPaint = new Paint(); 
    paints.add(mPaint); 
    colorlist.add(Color.parseColor(color)); 
    mBitmapPaint.setColor(Color.parseColor(color)); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 


    if (w > 0 && h > 0) { 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } else { 
     mBitmap = Bitmap.createBitmap(300, 250, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

} 


@Override 
public void draw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.draw(canvas); 
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
    // canvas.drawPath(mPath, mPaint); 

    int count = paints.size(); 
    for (int i = 0; i < count; i++) { 
     mPaint.setColor(colorlist.get(i)); 
     canvas.drawPath(paths.get(i), mPaint); 
    } 


} 

private void touch_start(float x, float y) { 
    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); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, mPaint); 
    //mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); 
    // kill this so we don't double draw 
    mPath.reset(); 
    // mPath= new Path(); 
} 


@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 SMILEY; 
} 

}

我使用这个类来画油画,我使用这个类在这样的活动。

mDrawingView = new DrawingView(getApplicationContext(), color); 
       mDrawingPad.addView(mDrawingView); 

mDrawingPad是一种线性布局,我在其中创建视图。

+0

你是如何改变颜色之间? – Gaurav

+0

我改变绘制方法的颜色。 – sovereign

+0

绘画列表中只有一个绘画对象。这就是为什么颜色没有变化。 – Gaurav

回答

0

我得到这个问题的解决方案,从here

我做根据我的代码,这种解决方案的一些变化,最后我发现它。

public class DrawingView extends View { 
private static final float TOUCH_TOLERANCE = 4; 
Paint mPaint; 
//MaskFilter mEmboss; 
//MaskFilter mBlur; 
Bitmap mBitmap; 
Canvas mCanvas; 
Path mPath; 
Paint mBitmapPaint; 
ProgressDialog pd; 
String color; 
ArrayList<Pair<Path, Paint>> p = new ArrayList<Pair<Path, Paint>>(); 
private ArrayList<Path> paths = new ArrayList<Path>(); 
private ArrayList<Paint> paints = new ArrayList<Paint>(); 
private float mX, mY; 

public DrawingView(Context context, String color) { 
    super(context); 
    // TODO Auto-generated constructor stub 
    mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setDither(true); 
    // mPaint.setColor(Color.parseColor(color)); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(10); 
    pd = new ProgressDialog(context); 
    mPath = new Path(); 
    paths.add(mPath); 
    mBitmapPaint = new Paint(); 
    paints.add(mPaint); 
    p.add(new Pair<Path, Paint>(mPath, mPaint)); 

    //colorlist.put(mPath,color); 
    mBitmapPaint.setColor(Color.parseColor(color)); 
} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 


    if (w > 0 && h > 0) { 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } else { 
     mBitmap = Bitmap.createBitmap(300, 250, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

} 


@Override 
public void draw(Canvas canvas) { 
    // TODO Auto-generated method stub 
    super.draw(canvas); 
    canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
    // canvas.drawPath(mPath, mPaint); 

    for (Pair<Path, Paint> pp : p) { 
     canvas.drawPath(pp.first, pp.second); 
    } 

} 

private void touch_start(float x, float y) { 
    mPaint.setColor(ImageEditOptionActivity.pencolor); 
    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); 
    // commit the path to our offscreen 

    mCanvas.drawPath(mPath, mPaint); 
    //mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SCREEN)); 
    // kill this so we don't double draw 
    p.add(new Pair<Path, Paint>(mPath, mPaint)); 
    mPath.reset(); 
    mPath = new Path(); 
    //colorlist.put(mPath,color); 
    mPaint = new Paint(mPaint); 
    p.add(new Pair<Path, Paint>(mPath, mPaint)); 


} 


@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 SMILEY; 
} 

}