Почему эта пользовательская кнопка перерисовывает себя без аннулирования

Итак, я пытаюсь научиться создавать 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);
    }
}

0 ответов

Другие вопросы по тегам