EDIT - I don't necessarily want to use the exact same code. All I want is to change paint color when a checkbox is selected to be able to draw on an image view. Any other approach is welcome.
I did go through related questions but couldn't get the answer. Please help instead of down-voting. I have an activity in which there are 3 checkboxes in different views. These checkboxes are to pick up a color. In the DrawingView class, I have to draw on my canvas with the color that is checked. What I want is to pass an integer value from the activity to the view class and set the color of paint accordingly. itried using getter and setters, but I get black color. I suppose this is because the color is being set in the constructor itself, and it does not change when I check any box.
Edit- Please refer this for updates in the below code
Code: MainActivity- the color/checkbox is selected here. And the drawing is to be done in the layout of this activity itself.
carImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { drawingView=new DrawingView(carImageView.getContext()); drawingView=new DrawingView(carImageView.getContext(),null); drawingView.setColor(color); return false; } }); scratchesCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color=1; chipsCb.setChecked(false); dentsCb.setChecked(false); } } }); chipsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color=2; scratchesCb.setChecked(false); dentsCb.setChecked(false); } } }); dentsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color=3; chipsCb.setChecked(false); scratchesCb.setChecked(false); } } }); }
View Class-
public DrawingView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); mPaint=new Paint(); if(color==1) mPaint.setColor(Color.RED); else if(color==2) mPaint.setColor(Color.BLUE); else if(color==3) mPaint.setColor(Color.GREEN); this.context=context; mPath=new Path(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.MITER); mPaint.setStrokeWidth(5f); } public void setColor(int color){ this.color=color; } public int getColor(){ return this.color; }
5 Answers
Answers 1
In the MainActivity, you are creating a DrawingView
that has no relationship to your image view that is displayed. So, when you change the color, you are not changing the color of the displayed image view but of the unconnected DrawingView
. The image view never has a new color defined and always defaults to black.
Here is a video of a small working app based upon your most recently supplied code. Maybe all the colors shouldn't change when a new check box is clicked, but you will be able to address that issue separately.
Changes I have made to the Java code are commented as such. Changes were also made to the XML to allow your code to run in my environment, but those changes were not commented.
MainActivity.java (Updated)
public class MainActivity extends AppCompatActivity { ImageView caricon; int itemSelected = 0; private DrawingView carImageView; Bitmap bitmap; ImageView backarrow; TextView nextcheckinAB2; Bitmap bmp; public static int color; CheckBox scratchesCb, chipsCb, dentsCb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); carImageView = (DrawingView) findViewById(R.id.carImageView); scratchesCb = (CheckBox) findViewById(R.id.scratchesCheckBox); chipsCb = (CheckBox) findViewById(R.id.ChipCheckbx); dentsCb = (CheckBox) findViewById(R.id.DentsCheckBox); // Change: Make sure to initialize the color color = 1; carImageView.setColor(color); carImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { // drawingView = new DrawingView(carImageView.getContext(),null); carImageView.setColor(color); return false; } }); scratchesCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { color = 1; carImageView.clearCanvas(); carImageView.setColor(1); // chipsCb.setChecked(false); dentsCb.setChecked(false); } } }); chipsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { color = 2; carImageView.setColor(2); scratchesCb.setChecked(false); dentsCb.setChecked(false); } } }); dentsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (b) { color = 3; // Change: Do like the other check boxes althogh not really needed. carImageView.setColor(3); chipsCb.setChecked(false); scratchesCb.setChecked(false); } } }); } }
DrawingView.java (Updated)
public class DrawingView extends android.support.v7.widget.AppCompatImageView { private Path mPath; private Paint mPaint; private float mX, mY; private static final float TOLERANCE = 5; int color; Context context; public DrawingView(Context context) { super(context); this.context = context; init(); } public DrawingView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context = context; init(); } public void init() { mPath = new Path(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.MITER); mPaint.setStrokeWidth(5f); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(mPath, mPaint); } public void setColor(int color) { if (color == 1) { mPaint.setColor(Color.RED); this.color = color; invalidate(); } else if (color == 2) { mPaint.setColor(Color.BLUE); this.color = color; invalidate(); } else if (color == 3) { mPaint.setColor(Color.GREEN); this.color = color; invalidate(); } } public int getColor() { return this.color; } private void onStartTouch(float x, float y) { mPath.moveTo(x, y); mX = x; mY = y; } private void moveTouch(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOLERANCE || dy >= TOLERANCE) { mPath.quadTo(mX, mY, (mX + x) / 2, (mY + y) / 2); mX = x; mY = y; } } public void clearCanvas() { mPath.reset(); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); invalidate(); } private void upTouch() { mPath.lineTo(mX, mY); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: onStartTouch(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE: moveTouch(x, y); invalidate(); break; case MotionEvent.ACTION_UP: upTouch(); invalidate(); break; } return true; } }
activity_main.xml (Updated)
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" android:orientation="horizontal" android:weightSum="3"> <HorizontalScrollView android:id="@+id/horizontalSrollView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:layout_weight="1"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="5dp" android:weightSum="2"> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_marginRight="2dp" android:layout_weight="0.5" android:background="@android:color/holo_red_light" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="2dp" android:layout_weight="1.5" android:text="Scratches" android:textColor="#000" /> </LinearLayout> <CheckBox android:id="@+id/scratchesCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:checked="true" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="5dp" android:weightSum="2"> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_marginRight="2dp" android:layout_weight="0.5" android:background="@android:color/holo_blue_light" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="2dp" android:layout_weight="1.5" android:text="Chips" android:textColor="#000" /> </LinearLayout> <CheckBox android:id="@+id/ChipCheckbx" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> </RelativeLayout> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="vertical"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="15dp" android:paddingRight="15dp" android:paddingTop="5dp" android:weightSum="2"> <ImageView android:layout_width="20dp" android:layout_height="20dp" android:layout_marginRight="2dp" android:layout_weight="0.5" android:background="@android:color/holo_green_light" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="2dp" android:layout_weight="1.5" android:text="Dings/Dents" android:textColor="#000" /> </LinearLayout> <CheckBox android:id="@+id/DentsCheckBox" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> </RelativeLayout> </LinearLayout> </HorizontalScrollView> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="8.7"> <[your package name].DrawingView android:id="@+id/carImageView" android:layout_width="200dp" android:layout_height="200dp" android:src="@mipmap/ic_launcher" android:layout_gravity="center_vertical" /> <!--<ImageView android:id="@+id/carImageView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical"/>--> </LinearLayout> </LinearLayout>
Answers 2
you need change function setColor.
1.change mPaint color.
2.add invalidate() for redraw view.
public void setColor(int color){ this.color=color; mPaint.setColor(color); invalidate(); }
Answers 3
You need to call invalidate()
on the View
to make it update.
Try this,
final DrawingView drawingView = new DrawingView(carImageView.getContext()); carImageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { drawingView.setColor(color); return false; } }); scratchesCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color = 1; drawingView.setColor(color); chipsCb.setChecked(false); dentsCb.setChecked(false); } } }); chipsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color = 2; drawingView.setColor(color); scratchesCb.setChecked(false); dentsCb.setChecked(false); } } }); dentsCb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b) { color = 3; drawingView.setColor(color); chipsCb.setChecked(false); scratchesCb.setChecked(false); } } });
DrawingView.java
public DrawingView(Context context) { super(context); this.context = context; init(); } public DrawingView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.context=context; init(); } private void init() { mPath=new Path(); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.MITER); mPaint.setStrokeWidth(5f); setColor(color); } public void setColor(int color){ this.color=color; if(color==1) mPaint.setColor(Color.RED); else if(color==2) mPaint.setColor(Color.BLUE); else if(color==3) mPaint.setColor(Color.GREEN); // Call invalidate invalidate(); }
Answers 4
Define static data member in your DrawingView
static int color = 1; //default
Then, from your activity simply call
DrawingView.color = someValue;
Static Keyword before variable color will make sure there is only one variable reference for all objects of your DrawingView class.
Answers 5
"even if I pass a static value, say 3 in main activity in drawingview.setColor(int)
it gives black. This means the setColor
function in Drawingview isn't working. "
Does this mean it will call paint.setColor(3)
?
If yes, this will of course turn your color black. Try passing Color.GREEN
instead
0 comments:
Post a Comment