交换自定义矩形视图颜色的方法不起作用

Method to swap colors of custom rectangle view does not work

我正在学习有关自定义视图的教程,并且我正在与讲师一起编写代码,但是我交换自定义视图颜色的方法不起作用。

这是我的 xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<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">


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

    </com.laila.android.customviews.views.CustomRectangle>

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

</androidx.constraintlayout.widget.ConstraintLayout>

这是我的自定义视图 class:

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 -> ?
        // 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);

    }
}

这是我的主要内容 activity:

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

应用程序如下所示:

但是当我点击交换按钮时,没有任何反应。为什么?我忘记了什么或者我做错了什么?

谢谢。

我明白了。我在 onDraw 方法中调用 rectPaint.setColor(Color.GREEN),所以每次重绘 canvas 时,颜色都设置为绿色。

我所要做的就是将 rectPaint.setColor(Color.GREEN) 放入我的 init 方法中,如下所示:

    private void init(AttributeSet attrs) {

        myRect = new Rect();
        rectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        rectPaint.setColor(Color.GREEN);
    }

现在交换颜色方法有效了。