交换自定义矩形视图颜色的方法不起作用
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);
}
现在交换颜色方法有效了。
我正在学习有关自定义视图的教程,并且我正在与讲师一起编写代码,但是我交换自定义视图颜色的方法不起作用。
这是我的 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);
}
现在交换颜色方法有效了。