【问题标题】:Make activity animate from top to bottom使活动从上到下动画
【发布时间】:2014-06-27 23:41:49
【问题描述】:

我正在编写一个 Android 应用程序,我希望通过从屏幕底部到顶部的动画来显示活动。我可以用这里的代码做到这一点:

但是,我无法制作反之亦然的动画,其中 Activity 会通过从屏幕顶部滑动到底部而消失。

我使用了上面链接中的代码;活动通过向上滑动出现,但在消失时,它会淡出,而不是滑到底部。

我什至尝试将代码放入onCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
    setContentView(R.layout.activity_all_metadata_display);
    initializePage();
}

【问题讨论】:

  • 对了,只是测试我给你的代码,效果非常好。我最近一直在使用左右滑动,但是上/下很好。
  • 这是按返回键的时候造成的吗?因为后退按钮不跟随overridePendingTransition 指定的动画
  • @ABFORCE BACK 按钮没有理由忽略overridePendingTransition()。您只需要将方法放在正确的位置,例如onPause()

标签: android android-animation android-transitions


【解决方案1】:

您需要从链接的问题中定义“向上滑动”动画,以及一些新的“向下滑动”动画来逆转该过程。

要查看的动画的重要部分是 fromYDeltatoYDelta 值。这些定义了动画开始和结束时的 Y 位置(视图顶部)。

slide_in_up.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0%p" />

slide_out_up.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="-100%p" />

slide_in_down.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="-100%p"
    android:toYDelta="0%p" />

slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="100%p" />

对于“向上滑动”动画,您应该在 onResume() 方法中覆盖待处理的过渡,如下所示:

protected void onResume()
{
    super.onResume();
    overridePendingTransition(R.anim.slide_in_up, R.anim.slide_out_up);
}

对于“向下滑动”动画,在您的 onPause() 方法中执行类似的操作:

protected void onPause()
{
    super.onPause();
    overridePendingTransition(R.anim.slide_in_down, R.anim.slide_out_down);
}

一些教程建议使用错误的生命周期方法:

  • onCreate() 不会在每次显示活动时调用
  • onDestroy()不是每次取走activity时都调用

而是使用每次屏幕转换时调用的方法:

  • onResume() 在向用户显示活动时调用
  • onPause() 将在活动被带走时调用

有关这些方法的详细信息,请查看 Android 开发者网站:


当你的屏幕显示时,它会从底部滑入。

当显示新屏幕时,您的屏幕会向下滑动。

【讨论】:

  • 还没有测试过这个代码,但是我之前用过这个技术几次,我可以说它有效。 @user2903200 你绝对应该采用这种方法。
  • 很好的答案!有没有办法在按下后退按钮而不是在用户交互后打开新活动时反转动画?谢谢
  • @Fakher 在我脑海中浮现,一个简单的方法可能是在onBackPressed() 中设置一个布尔标志,并在稍后覆盖你的动画时检查它。
  • 我是用另一种方式做的,如果 saveinstance 为空,我只是制作动画;)
【解决方案2】:

两种方法:

1.使用样式

假设您希望为所有活动实现此功能,请在您的基本主题中定义以下条目:

&lt;item name="android:windowAnimationStyle"&gt;@style/ActivityAnimations&lt;/item&gt;

然后定义如下样式:

<style name="ActivityAnimations" parent="android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/appear_from_bottom</item>
    <item name="android:activityOpenExitAnimation">@anim/hold</item>
    <item name="android:activityCloseEnterAnimation">@anim/hold</item>
    <item name="android:activityCloseExitAnimation">@anim/disappear_to_bottom</item>
</style>

@anim/hold 可以是这样的:

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:shareInterpolator="false" >
    <translate
        android:duration="1000"
        android:zAdjustment="bottom" />
</set>

2。使用 overridePendingTransition()

覆盖finish():

  @Override
  public void finish() {
    super.finish();
    overridePendingTransition(R.anim.hold, R.anim.disappear_to_bottom);
  }

重写 onBackPressed():

  @Override
  public void onBackPressed() {
    finish();
  }

覆盖 onOptionsItemSelected():

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
      case android.R.id.home:
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
  }

【讨论】:

  • 花费时间对动画和生命周期方法进行不必要的故障排除,但对我来说关键因素是 zAdjustment="bottom"。
【解决方案3】:

在您的主 xml 文件中。添加根标签的 id 并将其传递给函数。喜欢

/** The Constant ANIM_NO. */
public static final int ANIM_NO = 0;

public static void topToDown(Context context, View target, int type,
        int duration) {

    if (type == UtilityAnimations.ANIM_NO) {
        UtilityAnimations.topToDown(context, target, duration);
    } else {
        final Animation animation = new TranslateAnimation(
                Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, 0.0f,
                Animation.RELATIVE_TO_SELF, -1.0f,
                Animation.RELATIVE_TO_SELF, 0.0f);
        animation.setDuration(duration != 0 ? duration
                : UtilityAnimations.DURATION_MEDIAM);
        animation.setInterpolator(UtilityAnimations.getInterpolator(
                context, type));
        target.startAnimation(animation);
    }
}

【讨论】:

    【解决方案4】:

    您可以通过覆盖 onPause() 中的转换来反之亦然:

    @Override
    protected void onPause()
    {
        super.onPause();
        overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
    
    }
    

    【讨论】:

    • 最好使用onPause(),因为您不知道何时会调用onDestroy()
    猜你喜欢
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多