Создание уникальных postDelayed Runnables в цикле - PullRequest
1 голос
/ 06 июля 2011

Я эмулирую рамочную анимацию;У меня все это работает за исключением одного вопроса.У меня есть цикл for, в котором на каждой итерации он меняет изображение ImageView после задержки.

for(int i = 1; i <13; i++){
            if (stop== false){
                String imgName = "b"+ Integer.toString(i);
                  id = getResources().getIdentifier(imgName, "drawable", getPackageName());
                Handler handlerTimer = new Handler();
                handlerTimer.postDelayed(new Runnable(){
                    public void run() {
                       view.setImageDrawable((getResources().getDrawable(id)));            
                  }}, 300);

            }
        }

Проблема в том, что run () не обновляется на каждой итерации;это работает только один раз.

Как я могу обновить или сделать новый прогон ()?

Я открыт для любого другого способа сделать это.

Буду признателен за любой совет.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Шаг # 1: Определите Runnable как элемент данных вашей деятельности (или где бы ни находился этот код)

Шаг # 2: Сбросьте Handler, так как он вам не нужен -- postDelayed() также реализован на View

Шаг # 3: Создайте вспомогательный метод, который выполняет вызов postDelayed() - я буду называть этот метод здесь foo() - ипозвоните foo() там, где вы не вправе позвонить postDelayed()

Шаг № 4: В run() из Runnable, позвоните foo() еще раз, чтобы перенести Runnable на другой период задержки

0 голосов
/ 06 июля 2011

Попробуйте, если это не сработает, тогда попробуйте что-нибудь еще:

for(int i = 1; i <13; i++)
{
    if (stop== false)
    {
        String imgName = "b"+ Integer.toString(i);
        id = getResources().getIdentifier(imgName, "drawable", getPackageName());
        Handler handlerTimer = new Handler();
        handlerTimer.postDelayed(new Runnable(){
            public void run() {
                view.setImageDrawable((getResources().getDrawable(id)));
                view.invalidate();            
                }}, 300);

    }
}

invalidate () должен привести к тому, что ваш взгляд будет перекрашен, и вы получите желаемый эффект.Надеюсь, это поможет!

Это пример темы:

public class Main implements Runnable
{
    public Main()
    {
        Thread thread = new Thread(this);
        thread.start();
        //new Thread starts at run()
    }

    public void run()
    {
        String imgName = "b"+ Integer.toString(i);
        id = getResources().getIdentifier(imgName, "drawable", getPackageName());
        try
        {
            for(int i = 1; i <13&!stop; i++)
            {
                view.setImageDrawable((getResources().getDrawable(id)));
                Thread.sleep(300);
            }
        }catch(Exception e){e.printStackTrace();}
    }

    public static void main(String args[]){new Main();}
}

, если вам вообще что-то нужно, просто дайте мне знать!

...