android: onDraw вызывается постоянно - PullRequest
2 голосов
/ 19 октября 2011

У меня проблема с пользовательской кнопкой.onDraw () вызывается снова и снова, и я не могу понять, почему.

public class CircleButton extends Button {

    static final int StateDefault = 0;
    static final int StateFocused = 1;
    static final int StatePressed = 2;

    @Override
    protected void onDraw(Canvas canvas) {
        Log.v("Button","onDraw()");
        switch (mState) {
        case StateDefault:

            canvas.drawBitmap(this.getDefaultBitmap(), 0, 0, null);
            break;
        case StateFocused:
            canvas.drawBitmap(this.getFocusedBitmap(), 0, 0, null);
            break;
        case StatePressed:
            /*this.setWidth(3*radius);
            this.setHeight(3*radius);*/

            canvas.drawBitmap(this.getFocusedBitmap(), 0, 0, null);

            break;
        }
        super.onDraw(canvas);

    }

    @Override
    protected void drawableStateChanged() {
        Log.v("Button","drawableStateChanged()");
        if (isPressed()) {
            mState = StatePressed;

        } else if (hasFocus()) {
            mState = StateFocused;

        } else {
            mState = StateDefault;
        }
        // force the redraw of the Image
        // onDraw will be called!
        invalidate();
    }
    ...
}

Кнопка используется так:

RelativeLayout buttonLayout = (RelativeLayout) this.findViewById(R.id.top_layout);
CircleButton shootButton = new CircleButton(this);
RelativeLayout.LayoutParams relativeParams1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
relativeParams1.addRule(RelativeLayout.CENTER_VERTICAL);
relativeParams1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
relativeParams1.setMargins(0, 0, -20, 0);
buttonLayout.addView(shootButton, relativeParams1);

Есть идеи, что может быть не так?

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Извините, тупой сбой:

this.getDefaultBitmap() имел setBackgroundColor(0x00000000);вызовите его, что перезапустило onDraw.

Так что рекурсия:

onDraw() -> getDefaultBitmap() -> setBackgroundColor() -> onDraw

2 голосов
/ 19 октября 2011

Изменение метода drawableStateChanged():

  1. Не звоните invalidate
  2. Звоните super.drawableStateChanged().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...