2016-02-16 2 views
2

Я пытаюсь сделать заставку в Android Studio. У меня есть изображение, которое я хочу погасить (анимация). Затем, после окончания анимации, я хочу, чтобы приложение автоматически переключалось на главную активность. С моим текущим кодом основная активность отображается непосредственно, не пропуская анимацию в первую очередь. И я не понимаю, почему. Я обновил манифест Android, чтобы указать, что я хочу, чтобы моя активность Splash была запущена. До сих пор не работает:Как автоматически переключиться на другую активность после окончания анимации

public class Splash extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     fade(); 
    } 

    public void fade() { 
     ImageView logo = (ImageView)findViewById(R.id.logo); 
     logo.animate().alpha(0f).setDuration(1700); 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
    } 
} 

Однако, если удалить последние 2 строки (о намерениях), то мои анимационные дисплеи. Так что, как будто Intent делает Android полностью обойти мою анимацию.

ответ

0

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

aimate() возвращает ViewPropertyAnimator, который вы должны использовать для регистрации AnimatorListener с использованием setListener(). Когда слушатель запускает onAnimationEnd(), тогда необходимо вызвать startActivity.

logo.animate().alpha(0f).setDuration(1700).setListener(new AnimatorListener() { 
    // implement all the method with empty bodies, but this one is important: 
    public void onAnimationEnd(Animator animation) { 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
    } 
}; 
0

Похоже, что вы можете просто установить анимацию слушателя, как это:

public void fade() { 
    ImageView logo = (ImageView)findViewById(R.id.logo); 
    ViewPropertyAnimator anim = logo.animate(); 

    anim.setListener(new Animator.AnimatorListener() { 

     @Override 
     public void onAnimationStart(Animator animation) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationRepeat(Animator animation) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onAnimationEnd(Animator animation) { 
      Intent intent = new Intent(SplashActivity.this, MainActivity.class); 
      startActivity(intent); 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      // TODO Auto-generated method stub 

     } 
    }); 
    anim.alpha(0f).setDuration(1700).start(); 
} 

Однако, обратите внимание, что это неодобрение сделать специальные мероприятия заставок, как это. Для «правильного» способа сделать это, see here....

+0

Благодарим за ответ. Однако, когда я это делаю, приложение вылетает ... –

+0

@ J.Tur Что такое трассировка стека при сбоях? –

+0

02-17 19: 26: 07.641 19467-19467/com.example.jean.splashtest3687 E/AndroidRuntime: FATAL EXCEPTION: main Процесс: com.example.jean.splashtest3687, PID: 19467 –

0

Вы можете попробовать это в SplashActivity OnCreate() метод:

ImageView logo = (ImageView)findViewById(R.id.logo); 
logo.animate().alpha(0f).setDuration(1700); 

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() 
{ @Override 
    public void run() 
    { 
     Intent intent = new Intent(this, MainActivity.class); 
     startActivity(intent); 
    } 
},2000) ; 

Это покажет вашу анимацию и через 2 секунды, будет перемещаться в MainActivity.

Кроме того, с момента введения MaterialTheme, вы можете использовать Фирменная Launch Screen вместо создания SplashScreen. Его очень просто реализовать, и вы можете обратиться к this article by Antonio Leiva.

+0

Зачем это делать, когда вы можете получить обратный вызов, когда точно закончите анимацию? –

+0

Уверен, что это тоже хорошо. Мой - еще один способ обхода. –

+0

Привет. Благодарим за ваше предложение. Однако это дает мне 2 ошибки компиляции. –

0
ObjectAnimator fade = ObjectAnimator.ofFloat(logo, View.ALPHA, 0); 
fade.setDuration(1700); 
fade.addListener(new AnimatorListener() { 
    ... 
    @Override 
    public void onAnimationEnd(Animator animation) { 
     Intent intent = new Intent(Splash.this, MainActivity.class); 
     startActivity(intent); 
    } 
    ... 
}); 
Смежные вопросы