Change the color without affecting anything previously done

I have the following CustomView that I use for painting in my application:

 package com.test.testing; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Paint.Style; import android.view.MotionEvent; import android.widget.TextView; public class CustomView extends TextView { Paint paint; Path path; float x = 0; float y = 0; private int cWhite = Color.WHITE; public CustomView(Context context) { super(context); paint = new Paint(); path= new Path(); paint.setAlpha(255); paint.setColor(cWhite); paint.setStyle(Style.STROKE); paint.setStrokeWidth(20); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path,paint); canvas.drawCircle(x, y, 10, paint); } public boolean onTouchEvent(MotionEvent event) { int action = event.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: path.moveTo(event.getX(), event.getY()); path.lineTo(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: x = event.getX(); y = event.getY(); path.lineTo(x, y); invalidate(); break; case MotionEvent.ACTION_UP: path.lineTo(event.getX(), event.getY()); break; case MotionEvent.ACTION_CANCEL: break; default: break; } return true; } } 

I am setting up a FrameLayout that holds the canvas for drawing in my XML:

 <FrameLayout android:id="@+id/viewd" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" android:orientation="vertical" > </FrameLayout> 

I call inside my Activity to get a view so that the user can draw:

 layout = (FrameLayout)findViewById(R.id.viewd); //layout.removeAllViews(); view = new CustomView(Activity.this); view.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); layout.addView(view); 

I have another color parameter that the user can select to change the color of the paint stroke in Dialog in my Activity :

 public void colorHandle() { // custom dialog final Dialog dialog = new Dialog(this); dialog.setContentView(R.layout.colorlayout); dialog.setTitle("Choose a Drawing Color"); Button btnWH = (Button) dialog.findViewById(R.id.btnWhite); Button btnBL = (Button) dialog.findViewById(R.id.btnBlack); Button btnBLU = (Button) dialog.findViewById(R.id.btnBlue); Button btnCY = (Button) dialog.findViewById(R.id.btnCyan); Button btnDG = (Button) dialog.findViewById(R.id.btnDkGray); Button btnGR = (Button) dialog.findViewById(R.id.btnGray); Button btnGRE = (Button) dialog.findViewById(R.id.btnGreen); Button btnLG = (Button) dialog.findViewById(R.id.btnLtGray); Button btnMG = (Button) dialog.findViewById(R.id.btnMagenta); Button btnRD = (Button) dialog.findViewById(R.id.btnRed); Button btnYE = (Button) dialog.findViewById(R.id.btnYellow); if (btnWH != null) { btnWH.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.WHITE); dialog.dismiss(); } }); } if (btnBL != null) { btnBL.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.BLACK); dialog.dismiss(); } }); } if (btnBLU != null) { btnBLU.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.BLUE); dialog.dismiss(); } }); } if (btnCY != null) { btnCY.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.CYAN); dialog.dismiss(); } }); } if (btnDG != null) { btnDG.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.DKGRAY); dialog.dismiss(); } }); } if (btnGR != null) { btnGR.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.GRAY); dialog.dismiss(); } }); } if (btnGRE != null) { btnGRE.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.GREEN); dialog.dismiss(); } }); } if (btnLG != null) { btnLG.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.LTGRAY); dialog.dismiss(); } }); } if (btnMG != null) { btnMG.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.MAGENTA); dialog.dismiss(); } }); } if (btnRD != null) { btnRD.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.RED); dialog.dismiss(); } }); } if (btnYE != null) { btnYE.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { view.paint.setColor(Color.YELLOW); dialog.dismiss(); } }); } dialog.show(); } 

Everything works fine, but every time I select a new color, everything that was painted earlier also changes to the newly selected color. How to keep the former unchanged value no matter what new color is chosen next?

+2
source share
2 answers

You add to the same path with each TouchEvent. Path is then drawn using the current Paint color value. That is why you see everything, drawing in one color. You will need to create a separate Path and color for each color change, and then draw them sequentially, changing the Paint color for each drawPath () call

I do not think so. It’s not so bad to break out of the tracks.

 List<Pair<Path, Integer>> path_color_list = new ArrayList<Pair<Path,Integer>>() 

then every time you change color. Take the current path and view.paint.getColor and save it to your list.

 path_color_list.add( new Pair.create(path, view.paint.getColor()); path = new Path(); 

then in your draw () iteration through path_color_list, setting a new paint color every time

 for (Pair<Path,Integer> path_clr : path_color_list ){ paint.setColor(path_clr.second); canvas.drawPath( path_clr.first, paint); } 

followed by the last drawPath () that you have

+4
source

Just do one thing, always create a new instance of the class view view1.paint.setColor(Color.LTGRAY); , then layout.addView(view1); means creating a new view, it will also save the previous one, its work for me. Very simple!

+3
source

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


All Articles