Regarding Android drawing color

DrawView.java

public class DrawView extends View implements OnTouchListener { private Canvas mCanvas; private Path mPath; public Paint mPaint; ArrayList<Path> paths = new ArrayList<Path>(); private ArrayList<Path> undonePaths = new ArrayList<Path>(); private MaskFilter mEmboss; private MaskFilter mBlur; private Bitmap im; public DrawView(Context context) { super(context); setFocusable(true); setFocusableInTouchMode(true); this.setOnTouchListener(this); paths.clear(); undonePaths.clear(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(Color.BLUE); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(4); mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, 0.4f, 6, 3.5f); mBlur = new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL); mCanvas = new Canvas(); mPath = new Path(); // paths.add(mPath); im = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Share.cColor); for (Path p : paths) { canvas.drawPath(p, mPaint); } canvas.drawPath(mPath, mPaint); } private float mX, mY; private static final float TOUCH_TOLERANCE = 4; private void touch_start(float x, float y) { mPaint.setColor(Share.dColor); undonePaths.clear(); mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; Log.e("", "pathsize:::" + paths.size()); Log.e("", "undonepathsize:::" + undonePaths.size()); } 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); // kill this so we don't double draw paths.add(mPath); mPath = new Path(); Log.e("", "pathsize:::" + paths.size()); Log.e("", "undonepathsize:::" + undonePaths.size()); } public void onClickUndo() { Log.e("", "pathsize:::" + paths.size()); Log.e("", "undonepathsize:::" + undonePaths.size()); if (paths.size() > 0) { undonePaths.add(paths.remove(paths.size() - 1)); invalidate(); } else { } // toast the user } public void onClickRedo() { Log.e("", "pathsize:::" + paths.size()); Log.e("", "undonepathsize:::" + undonePaths.size()); if (undonePaths.size() > 0) { paths.add(undonePaths.remove(undonePaths.size() - 1)); invalidate(); } else { } // toast the user } @Override public boolean onTouch(View arg0, 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; } 

}

I try to paint with different colors, but whenever I change the color of the paint, all previous paths or drawings get and paint with an updated color. I want to paint in different colors, how can I do this? please give me some solutions for this.

+6
source share
1 answer

To do this, you need to create a new Paint for each drawn object. This is because when you redraw the Canvas it refers to the same Paint object every time, so all paths will use this paint.

First, I would modify your paths array containing both Paint and Path . You can achieve this using the Android Pair type.

 ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>(); 

You will also have to convert the undonePaths variable this way.

Then in your touch_up() method you need to add this new Paint object.

 Paint newPaint = new Paint(mPaint); // Clones the mPaint object paths.add(new Pair<Path, Paint>(mPath, newPaint)); 

Finally, your loop should also be adjusted:

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

This is a fairly intense amount of memory, so you will need to take care to reset these elements when they are no longer in use, but in order to have so many different colors, you must have all these different Paint objects.

+10
source

Source: https://habr.com/ru/post/922101/


All Articles