Чистый способ реализовать постепенное угасание яркости в Android? - PullRequest
11 голосов
/ 24 августа 2011

На данный момент у меня есть код для плавной регулировки яркости, который выглядит примерно так:

new Thread() {
    public void run() {
        for (int i = initial; i < target; i++) {
            final int bright = i;
            handle.post(new Runnable() {
                public void run() {
                    float currentBright = bright / 100f;
                    window.getAttributes().screenBrightness = currentBright;
                    window.setAttributes(window.getAttributes());
                });
            }
            try {
                sleep(step);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}.start();

Я не уверен, считается ли это хорошей методологией (я рассматривал использование ASyncTask, но не вижу преимуществ в этом случае). Есть ли лучший способ добиться затухания подсветки?

РЕДАКТИРОВАТЬ: я сейчас использую TimerTask следующим образом:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        final float currentBright = counter[0] / 100f;
        handle.post(new Runnable() {    
            public void run() {
                window.getAttributes().screenBrightness = currentBright;
                window.setAttributes(window.getAttributes());
                if (++counter[0] <= target) {
                    cancel();
                }
            }
        });
    }
}, 0, step);

Причина, по которой я использую массив для счетчика, заключается в том, что он должен быть final для доступа к Runnable, но мне нужно изменить значение. При этом используется меньше ресурсов процессора, но все же больше, чем мне нравится.

EDIT2: Aaa и третья попытка. Спасибо CommonsWare за совет! (Надеюсь, я правильно его применил!)

    handle.post(new Runnable() {
        public void run() {
            if (counter[0] < target) {
                final float currentBright = counter[0] / 100f;
                window.getAttributes().screenBrightness = currentBright;            
                window.setAttributes(window.getAttributes());
                counter[0]++;
                handle.postDelayed(this, step);
            }
        }
   });

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

как насчет уменьшения яркости до половины на каждой итерации.

Тогда цикл завершится в O (log n), а не O (n) в текущем решении.

1 голос
/ 15 сентября 2011
...