如何在启动时仅启动一次Android视图动画?

问题描述:

我目前正在为我的Android应用程序开发一个非常简单的用户界面。我的目标是在启动时动画一些(我不知道有多少)按钮,永远不会。如何在启动时仅启动一次Android视图动画?

因此,遵循官方文档,阅读java文档和在stackoverflow上搜索以及我终于得到它的工作。以下是我对单个测试视图所做的操作。

  • 在OnCreate()方法中设置视图和动画。
private TextView test_text; 
private Animation test_anim; 
... 

protected void onCreate(Bundle savedInstanceState) { 

    ... 

    test_text = (TextView) findViewById(R.id.text); 
    test_anim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.test_animation); 
} 
  • 开始在OnWindowFocusChanged()方法中的动画。
@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    test_text.startAnimation(test_anim); 
} 

此过程工作,活动开始时执行的动画,唯一的问题是,onWindowFocusChanged()方法,每次叫活性改变状态。因此,文本在应用程序恢复时进行动画处理,当布局旋转时就会像这样。

所以,重复一遍:我的目标是仅在应用启动时动画文本,然后永久停止。

如果有帮助,我已经尝试将其他方法(如onStart()或onResume())中的动画开始,但问题仍然相同。

只要你可以添加与初始值的布尔变量真,第一次后,你可以将其值修改为false,里面的onfocus你可以添加另一个条件

If(boolean){do the animation; 
boolean=false;} 

这将千方百计想让你想要的,但如果你要在应用程序生命周期中动画一次,您可以使用共享首选项或者只是在应用程序类中添加静态布尔变量

您可以使用SharePreferences来检查布尔值。如果是或不存在,则意味着首次启动,或者您可以在onWindowFOcusChange()方法中为应用程序设置动画。将其设置为false将永不再行动。

//////////////////////////// 
/// CONSTANTS 
//////////////////////////// 

private static final String PREF_NAME = "pref_name"; 
public static final String IS_STARTUP = "is_startup"; 

//////////////////////////// 
/// FIELDS 
//////////////////////////// 

private SharedPreferences settings; 

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 

    settings = getSharedPreferences(PREF_NAME, MODE_PRIVATE); 
     if (settings.getBoolean(IS_START_UP, true)) { 
      test_text.startAnimation(test_anim); 
      settings.edit().putBoolean(IS_START_UP, false).commit(); 
     } 
} 
如果你希望在应用程序启动下一次再aniamte

,你可以把选项IS_START_UP时退出应用程序设置为true。

if (!settings.getBoolean(IS_START_UP, false)) { 
    settings.edit().putBoolean(IS_START_UP, true).commit(); 
} 
+0

好的,明白了。除了当我旋转屏幕时,共享的首选项在任何情况下都能正常工作。在那种情况下,动画再次重复。就像每次旋转屏幕一样,活动从一开始就重新开始。任何想法如何解决这个问题?也许这是我不了解屏幕旋转的东西。 – Claff

使用SharedPreference存储布尔变量&动画开始在此之前每次都使它立即真的第一个动画&检查后。

if(!isAnimatedAlready){ 
animate(); 
setIsAnimated(true); 
}else{}