Перерисовка рисования по таймеру с использованием invalidateSelf () не работает - PullRequest
2 голосов
/ 08 февраля 2011

У меня есть классный инструмент Drawable.Мне нужно периодически перерисовывать его, чтобы получить эффект "моргания".Я использую timer.schedule для планирования invalidateSelf (), но ничего не произошло.

private class DrawableImpl extends Drawable {
    private boolean blinkFlag = false;
    private Timer timer = new Timer(false);

    private int maxFlashCount = 21;
    private int intervalBetweenFlashesInMs = 100;
    private int currentFlashNumber = 0;

    @Override
    public void draw(Canvas canvas) {
        Log.i(TAG, "draw");

        /*draw stable part*/

        if (blinkFlag ) {
            Log.i(TAG, "blink");
            /*draw bliking part*/
        }

        blinkFlag = !blinkFlag;

        final DrawableImpl drawableImpl = this; 
        if (currentFlashNumber < maxFlashCount) {
            Log.i(TAG, "schedule");
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.i(TAG, "run from back");
                            drawableImpl.invalidateSelf();
                        }
                    });
                }
            }, intervalBetweenFlashesInMs);
            currentFlashNumber++;
        }
    }
}

В журнале что-то вроде этого
02-08 23: 07: 44.791: INFO / (258): draw
02-08 23: 07: 44,791: INFO / (258): мигание
02-08 23: 07: 44,791: INFO / (258): расписание
02-08 23: 07: 45.011: INFO /(258): бег назад:
02-08 23: 07: 45.021: ИНФО / (258): ничья
02-08 23: 07: 45.021: ИНФО / (258): расписание
02-08 23: 07: 45.171: INFO / (258): бег назад)
02-08 23: 07: 45.171: INFO / (258): ничья
02-08 23: 07: 45.171: INFO / (258): мигает
02-08 23: 07: 45.171: INFO / (258): расписание
02-08 23: 07: 45.331: INFO / (258): запуск назад

Почему это не сработало?Должен ли я использовать другие методы для этого?

1 Ответ

2 голосов
/ 09 февраля 2011

Я думаю, что документ разработчика содержит ответ.

Использовать текущий Drawable.Callback реализация, чтобы иметь этот Drawable перерисованы. ничего не делает, если нет Обратный вызов, прикрепленный к Drawable.

...