Таймер не работает в Android при вызове invalidate()

Я хочу создать эффект мигания, нарисовав путь серым цветом, белым (в соответствии с фоном), а затем снова серым. Я хочу мигать 3 раза, показывая серый на 1 секунду, белый на 1 секунду, снова серый на 1 секунду и т. д.

Когда я создал Handler для postDelayed(), программа пропустила run() и не выполнила его в установленное время, и не произошло перепрошивки:

final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                invalidate(); //calls onDraw()
                Log.d(TAG, "Flashing now now");
            }
        }, 1000);

Как бы реализовать такой функционал прошивки с таймером и прошить 3 раза?

Спасибо!


person Eddev    schedule 18.04.2016    source источник
comment
почему бы вам не попробовать timertask?   -  person JNI_OnLoad    schedule 19.04.2016
comment
Как бы я это сделал? Не могли бы вы привести пример?   -  person Eddev    schedule 19.04.2016


Ответы (2)


Вы можете попробовать что-то вроде этого,

int delay = 5000; // delay for 5 sec.

int period = 1000; // repeat every sec.

Timer timer = new Timer();

timer.scheduleAtFixedRate(new TimerTask() {

public void run() {

System.out.println("done}

}, delay, period);

В противном случае у вас есть много других примеров, подобных этому Пример 1, Пример 2, Пример 3 и т. д. Если вам все еще нужна помощь, дайте мне знать.

person JNI_OnLoad    schedule 18.04.2016

Это пример рабочего кода того, как мы меняем цвет земного шара с синего на красный и обратно. Вы можете изменить код внутри, чтобы ограничить, сколько раз и какую задержку вы хотите.

protected MyGlobeFlasherHandler handlerFlashGlobe = new MyGlobeFlasherHandler(this);

@Override
protected onCreate(Bundle bundle) { 
       handlerFlashGlobe.sendEmptyMessageDelayed(0, 700);
}

/**
 * private static handler so there are no leaked activities.
 */
protected static class MyGlobeFlasherHandler extends Handler {


        private final WeakReference<HomeBase> activity;

        public MyGlobeFlasherHandler(HomeBase activity) {
            this.activity = new WeakReference<HomeBase>(activity);
        }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);

        if (activity.get() != null) {
            if (activity.get().shadedGlobe) {
                activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_blue));
            } else {
                activity.get().imgData.setImageDrawable(activity.get().getResources().getDrawable(R.drawable.globe_red));
            }

            activity.get().shadedGlobe = !activity.get().shadedGlobe;

            sendEmptyMessageDelayed(0, 700);
        }
    }

}
person Kristy Welsh    schedule 18.04.2016
comment
Привет, Кристи, здесь вы анимируете, используя два разных изображения. Это не очень хорошая практика программирования; в идеале вы хотели бы установить файл .png и программно изменить цвет, возможно, используя setIndent(). - person Eddev; 22.04.2016
comment
@Eddev Можете ли вы сказать мне, что вы подразумеваете под плохим программированием? Кроме того, изображение является фотографией, и я не могу себе представить изменение цвета программно. - person Kristy Welsh; 22.04.2016