Как менять изображения одно за другим на кнопках ImageButtons? - PullRequest
0 голосов
/ 17 августа 2011

Я пытаюсь изменить изображения на кнопках и вернуть их обратно к исходному изображению, и сделать это одно за другим в 4 разных изображениях.

Я пробовал следующий код, но это не такне работает, результат заставляет мигать только одно из изображений в течение миллисекунды:

ArrayList<Integer> scenario = new ArrayList<Integer>();

...

void delayedPlay(){
    // each button should be posted in 1 second spacing
    int count = 1;
    for (final int btnid : scenario){
        // turn off
        final Runnable r2 = new Runnable(){
            public void run(){ 
                imagebuttons[btnid].setImageBitmap(imagesTurnedOff.get(btnid)); 
                }
        };

        // turn on and call turn off
        Runnable r1 = new Runnable(){
            public void run(){ 
                imagebuttons[btnid].setImageBitmap(imagesTurnedOn.get(btnid));
                imagebuttons[btnid].postDelayed(r2, 1000);
                }
        };

        // post the above delayed
        imagebuttons[btnid].postDelayed(r1, 1000 * count++);
    }
}

Кто-нибудь может мне помочь, и предложить, почему это не работает для меня?

1 Ответ

1 голос
/ 18 августа 2011

Это сработало для меня.Вы уверены, что imagesTurnedOn / imagesTurnedOff возвращают правильные значения?

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

public void deplayedPlay2() {
    if (mTaskHandler == null) {
        mTaskHandler = new AsyncTask<Void, Void, Void>() {
            @Override
            public Void doInBackground(Void... params) {
                long now = System.currentTimeMillis();
                try {
                    for (final int btnid : mScenario) {
                        Log.d(TAG,
                                "ON: " + btnid + " (" + (System.currentTimeMillis() - now) + ")");
                        mButtons[btnid].post(new Runnable() {
                            public void run() {
                                mButtons[btnid]
                                        .setBackgroundDrawable(GoodbyeAndroidActivity.this
                                                .getResources()
                                                .getDrawable(
                                                        R.drawable.on_icon));

                            }
                        });
                        Thread.sleep(1000);
                        Log.d(TAG,
                                "OFF: " + btnid + " (" + (System.currentTimeMillis() - now) + ")");
                        mButtons[btnid].post(new Runnable() {
                            public void run() {
                                mButtons[btnid]
                                        .setBackgroundDrawable(GoodbyeAndroidActivity.this
                                                .getResources()
                                                .getDrawable(
                                                        R.drawable.off_icon));
                            }
                        });
                    }
                } catch (InterruptedException ex) {
                    Log.d(TAG, "Interrupted.");
                }
                return null;
            }

            @Override
            public void onPostExecute(Void param) {
                Log.d(TAG, "Done!");
                mTaskHandler = null;
            }
        };
        mTaskHandler.execute();
    }
}

Не забудьте обработать это в onPause ():

public void onPause() {
    super.onPause();
    if (mTaskHandler != null) {
        mTaskHandler.cancel(true);
        // May want to reset buttons too?
    }
}
...