Почему моя анимация зависает при возвращении к активности, содержащей ее? - PullRequest
2 голосов
/ 02 февраля 2012

Я все еще в новинку с Android, так что простите, если это очевидная ошибка. В этом упражнении я использую ViewPager для горизонтальной прокрутки трех макетов, содержащих ImageButton с анимированным фоном в зависимости от его текущего состояния. Когда кнопка нажата, начинается новое действие. Однако, когда я нажимаю кнопку «Назад», чтобы вернуться к действию, содержащему анимацию из нового действия, иногда анимация останавливается или воспроизводится быстрее, чем следовало бы. Я написал метод запуска анимации, который я использую в onWindowFocusChanged() и onRestart(). Я работаю в Android 2.1 (API 7).

Это мой код:

public class CopyOfWorld extends Activity{

    MediaPlayer muzak;
    Boolean mSwitch = false;
    ImageButton holmes;
    AnimationDrawable holmesAnimation;

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.world);

        Preferencer pp = (Preferencer)getApplicationContext();

        ViewPagerAdapter adapter = new ViewPagerAdapter();
        ViewPager myPager = (ViewPager) findViewById(R.id.viewpager);
        myPager.setAdapter(adapter);
        myPager.setCurrentItem(1);


        if(pp.getMuzak()){
            mSwitch = true;
            muzak = MediaPlayer.create(CopyOfWorld.this, R.raw.level1);
            muzak.setLooping(true);
            muzak.start();
        }
    }

    public void clicker(View v){
     Intent myIntent = new Intent(CopyOfWorld.this , Subworld.class);
        startActivityForResult(myIntent, 0);
   }

    @Override
    public void onWindowFocusChanged(boolean hasFocus){
        super.onWindowFocusChanged(hasFocus);
        beginRender();

    }

    @Override
    protected void onPause(){
        super.onPause();
        if(mSwitch){
        muzak.release();
        }
    }

    @Override
    protected void onRestart(){
        super.onRestart();
        Preferencer pp = (Preferencer)getApplicationContext();
        if(pp.getMuzak()){
            muzak = MediaPlayer.create(CopyOfWorld.this, R.raw.level1);
            muzak.setLooping(true);
            muzak.start();
        }
        beginRender();
    }


    public void beginRender(){
        ImageButton holmes = (ImageButton) findViewById(R.id.subworlder);
        StateListDrawable background = (StateListDrawable) holmes.getBackground();
        Drawable current = background.getCurrent();
        if(current instanceof AnimationDrawable){
            holmesAnimation = (AnimationDrawable) current;
            holmesAnimation.start();
        }
    }
}

Я пытался вызвать метод beginRender() в ()onResume, но затем приложение просто зависает.

Может ли кто-нибудь указать мне правильное направление?

EDIT:

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

В настоящее время xml, содержащий эти ImageButton s, определяет их background s как анимацию и не имеет источника (src). Но когда я изменяю background на прозрачный, а src на анимацию, приложение вылетает.

Есть какие-нибудь подсказки?

...