#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); }
Теперь работает метод подкачки цветов.