Метод для замены цветов пользовательского вида прямоугольника не работает

#java #android #view #android-custom-view

Вопрос:

Я следую учебнику о пользовательских представлениях и пишу код вместе с инструктором, но мой метод обмена цветами моего пользовательского представления не работает.

Вот мой xml-макет:

 lt;?xml version="1.0" encoding="utf-8"?gt; lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:app="http://schemas.android.com/apk/res-auto"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:padding="20dp"  tools:context=".MainActivity"gt;    lt;com.laila.android.customviews.views.CustomRectangle  android:id="@ id/my_custom_rectangle"  android:layout_width="match_parent"  android:layout_height="200dp"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent"  app:layout_constraintTop_toTopOf="parent"gt;   lt;/com.laila.android.customviews.views.CustomRectanglegt;   lt;Button  android:id="@ id/btn_swap"  android:layout_width="0dp"  android:layout_height="wrap_content"  android:text="Swap color"  app:layout_constraintBottom_toBottomOf="parent"  app:layout_constraintEnd_toEndOf="parent"  app:layout_constraintStart_toStartOf="parent" /gt;  lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;  

Вот мой пользовательский класс представления:

 public class CustomRectangle extends View {   private static final int SQUARE_SIZE = 200;  private Rect myRect;  private Paint rectPaint;   public CustomRectangle(Context context) {  super(context);   init(null);  }   public CustomRectangle(Context context, @Nullable AttributeSet attrs) {  super(context, attrs);   init(attrs);  }   public CustomRectangle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  super(context, attrs, defStyleAttr);   init(attrs);  }   public CustomRectangle(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {  super(context, attrs, defStyleAttr, defStyleRes);   init(attrs);  }   // Initialization method  private void init(AttributeSet attrs) {   myRect = new Rect();  rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);  }   public void swapColor() {   // Reminder: ternary conditional operator -gt; ?  // boolean statement ? true result : false result;   rectPaint.setColor(rectPaint.getColor() == Color.GREEN ? Color.RED : Color.GREEN);   postInvalidate();  }   @Override  protected void onDraw(Canvas canvas) {  super.onDraw(canvas);   myRect.left = 50;  myRect.top = 50;  myRect.right = myRect.left   SQUARE_SIZE;  myRect.bottom = myRect.top   SQUARE_SIZE;   rectPaint.setColor(Color.GREEN);   canvas.drawRect(myRect, rectPaint);   } }   

Вот моя основная деятельность:

 public class MainActivity extends AppCompatActivity {   private CustomRectangle customRectangle;  private Button buttonSwap;   @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);   customRectangle = findViewById(R.id.my_custom_rectangle);  buttonSwap = findViewById(R.id.btn_swap);   buttonSwap.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  customRectangle.swapColor();  }  });  } }  

Here’s what the application looks like:

введите описание изображения здесь

Но когда я нажимаю кнопку подкачки, ничего не происходит. Почему? Что я забыл или что я делаю не так?

Спасибо.

Ответ №1:

Я все понял. Я вызывал rectPaint.setColor(Color.GREEN) внутри onDraw метода, поэтому каждый раз, когда холст перерисовывался, цвет был установлен на зеленый.

Все, что мне нужно было сделать, это вместо этого ввести rectPaint.setColor(Color.GREEN) свой init метод, вот так:

 private void init(AttributeSet attrs) {   myRect = new Rect();  rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);   rectPaint.setColor(Color.GREEN);  }  

Теперь работает метод подкачки цветов.