2016-02-16 46 views
2

我想在Android Studio中做一个启动画面。我有一张我想要淡出的图像(动画)。然后,在动画结束后,我希望应用程序自动切换到主要活动。使用我当前的代码,主要活动直接显示,而不必先通过动画。我不明白为什么。我更新了Android Manifest以指定我希望启动我的Splash Activity。仍然没有工作:如何在动画结束后自动切换到另一个活动

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

当您开始动画时,不会导致代码停止,直到动画完成。相反,动画的每个帧都会随着时间安排。

animate()返回ViewPropertyAnimator,您应该使用setListener()来注册AnimatorListener。当侦听器触发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:致命例外: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,则可以使用品牌启动屏幕而不是创建闪屏的。这是非常简单的实施,你可以参考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); 
    } 
    ... 
}); 
相关问题