Почему эта пользовательская кнопка перерисовывает себя без аннулирования
Итак, я пытаюсь научиться создавать custom views
, и я узнал, что я должен перерисовать вид после желаемых изменений, используя invalidate()
метод.
Эта небольшая программа является одним из упражнений на каком-то сайте. Это должна быть стандартная кнопка, внутри которой находится цветной прямоугольник. И когда мы нажимаем кнопку, прямоугольник меняет цвет.
Это кажется очень логичным, простым и работает очень хорошо. Но когда я хотел поиграть с этим, и устранить invalidate()
метод в onTouchEvent()
метод, я ожидал, что цветной прямоугольник не изменит цвет после щелчка, но он работал так же хорошо, как с invalidate()
!!
Так что кажется invalidate()
метод здесь бесполезен, и он меня смущает и я хочу понять почему? Спасибо
public class ColorButton extends AppCompatButton {
private TypedArray mCouleurs = null; // contains 4 colors
private int position = 0;
private Rect mRect = null;
private Paint mPainter = new Paint(Paint.ANTI_ALIAS_FLAG);
public ColorButton(Context context) {
super(context);
init();
}
public ColorButton(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ColorButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
Resources res = getResources();
mCouleurs = res.obtainTypedArray(R.array.colors);
setText(R.string.change_color);
mRect = new Rect();
mPainter.setColor(mCouleurs.getColor(position, -1));
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
if(changed) {
mRect.left = Math.round(0.5f * getWidth() - 50);
mRect.top = Math.round(0.75f * getHeight() - 50);
mRect.right = Math.round(0.5f * getWidth() + 50);
mRect.bottom = Math.round(0.75f * getHeight() + 50);
}
super.onLayout(changed, left, top, right, bottom);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
position++;
position %= mCouleurs.length();
mPainter.setColor(mCouleurs.getColor(position, -1));
//invalidate();
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawRect(mRect, mPainter);
super.onDraw(canvas);
}
}