将活动的价值传递给观看类

编辑 – 我不一定要使用完全相同的代码。 我想要的只是当选中一个checkbox可以在图像视图上绘制时改变颜色的颜色。 任何其他方法是受欢迎的。

我确实经历了相关的问题,但没有得到答案。 请帮忙,而不是倒计时。 我有一个活动,其中有3个checkbox在不同的意见。 这些checkbox将select一种颜色。 在DrawingView类中,我必须在canvas上绘制选中的颜色。 我想要的是从活动传递一个整数值到视图类,并相应地设置油漆的颜色。 使用getter和setter,但我得到黑色。 我想这是因为颜色是在构造函数本身中设置的,而且当我检查任何方块时它不会改变。

编辑 – 请参阅下面的代码更新

代码: MainActivity – 在这里select颜色/checkbox。 在这个活动本身的布局中要完成绘图。

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); } } }); } 

查看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; } 

Solutions Collecting From Web of "将活动的价值传递给观看类"

在MainActivity中,您正在创build一个DrawingView ,它与显示的图像视图没有任何关系。 所以,当你改变颜色时,你并没有改变显示图像视图的颜色,而是改变了未连接的DrawingView的颜色。 图像视图从来没有定义新的颜色,并且总是默认为黑色。

这是一个基于你最近提供的代码的小型工作应用程序的video。 也许所有的颜色不应该改变,当一个新的checkbox被点击,但你将能够解决这个问题分开。

我对Java代码所做的更改都是这样评论的。 还对XML进行了更改,以使您的代码可以在我的环境中运行,但是这些更改没有被评论。

在这里输入图像说明

MainActivity.java(更新)

 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(更新)

 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(更新)

  <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> 

你需要改变函数setColor。

1.改变颜色。

2.add invalidate()为重绘视图。

 public void setColor(int color){ this.color=color; mPaint.setColor(color); invalidate(); } 

您需要在View上调用invalidate()以使其更新。

尝试这个,

 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(); } 

在DrawingView中定义静态数据成员

static int color = 1; //默认

然后,从你的活动只需打电话

DrawingView.color = someValue;

variables颜色之前的静态关键字将确保DrawingView类的所有对象只有一个variables引用。

“即使我传递一个静态值,在drawingview.setColor(int)主要活动中说3,它会给黑色,这意味着Drawingview中的setColor函数不起作用。

这是否意味着它会调用paint.setColor(3)

如果是的话,这当然会把你的颜色变成黑色。 尝试传递Color.GREEN