Tuesday, December 5, 2017

passing value from activity to view class

Leave a Comment

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.

enter image description here

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

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment