当前位置: 代码迷 >> java >> 如何在启动时仅对Android View设置一次动画?
  详细解决方案

如何在启动时仅对Android View设置一次动画?

热度:78   发布时间:2023-07-26 13:51:29.0

我目前正在为我的Android应用开发一个非常简单的UI。 我的目标是为启动和“永不再”上的一些按钮(我不知道有多少个)设置动画。

因此,按照官方文档,阅读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()方法中启动Animation。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
     test_text.startAnimation(test_anim);
}

此过程有效,活动开始时执行动画,唯一的问题是每次活动状态更改时都会调用onWindowFocusChanged()方法。 因此,当应用程序恢复运行,布局旋转以及诸如此类的东西时,文本会发出动画效果。

因此,重复:我的目标是在应用程序启动时仅对文本进行动画处理,然后永远停止。

如果有帮助,我已经尝试将Animation开始以其他方法(例如onStart()或onResume())开始,但是问题仍然相同。

您可以简单地添加一个初始值为true的布尔变量,并且在第一次使用后可以将其值更改为false,并且可以在onfocus内添加另一个条件

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

这会满足您的需要,但是如果您希望动画在应用程序生命周期中只有一次,则可以使用共享首选项或在应用程序类中简单地添加静态布尔变量

您可以使用SharePreferences来检查布尔值。 如果为true或不存在,则意味着首次启动,或者您可以在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();
        }
 }

如果您想在下次启动应用程序时再次设置动画,可以在退出应用程序时将首选项IS_START_UP设置为true。

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

使用SharedPreference来存储一个布尔变量,并在第一个动画后立即将其设为true,并在每次动画开始前进行检查。

if(!isAnimatedAlready){
animate();
setIsAnimated(true);
}else{}
  相关解决方案