返回结果: 返回按钮按下时滑出动画无法正常工作?

14

我在进入或退出活动时使用动画,进入活动的动画效果很好,但退出动画效果不佳。当我按下返回按钮时,我开始执行退出动画。发生的情况是它首先为当前活动启动进入动画,然后显示上一个活动,而我想要的是在按下返回按钮时进行简单的退出动画。

Slide_out.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:fromXDelta="0%p"
    android:toXDelta="-100%p" >

</translate>

Slide_in.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:fromXDelta="100%p"
    android:toXDelta="0%p" >

</translate>

在操作栏返回按钮按下时

public boolean onOptionsItemSelected(MenuItem item) {
    // TODO Auto-generated method stub
    switch (item.getItemId()) {
    case R.id.home:

        finish();
        overridePendingTransition(R.anim.slide_out, R.anim.slide_in);
        return true;


    default:
        break;
    }

    return super.onOptionsItemSelected(item);

}

假设您现在有一个ActivityA,您希望从中启动ActivityB,并且想知道ActivityB将如何退出。请稍微解释一下,以便我可以提供帮助。 - Mukesh Rana
我想要在B页面上添加进入动画。我已经能够实现了,但是我希望从B页面返回到之前的活动(A)时能够有一个退出动画,类似从左到右滑动的效果。我应该如何实现呢? - Tarun Sharma
所以你需要ActivityB从左侧滑动到ActivityA上方,而在返回时,你希望ActivityB向右滑动,而ActivityA保持不变? - Mukesh Rana
8个回答

31

首先在您的anim文件夹中创建一个更多的动画,即nothing.xml

nothing.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:fromXDelta="0%"
    android:toXDelta="0%" >

</translate>

这是你的slide_in.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:fromXDelta="-100%"
    android:toXDelta="0%" >

</translate>

并且slide_out.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:fromXDelta="0%"
    android:toXDelta="100%" >

</translate>

现在按照以下方式调用您的NewActivity:

startActivity(new Intent(CurrentActivity.this, NewActivity.class));
overridePendingTransition(R.anim.slide_in, R.anim.nothing);

然后在单击返回按钮时执行以下操作

finish();
overridePendingTransition(R.anim.nothing, R.anim.slide_out);

如何在B退出时移动进入的A活动。 - Tarun Sharma
抱歉,我的需求刚刚有所变更。 - Tarun Sharma
1
只需在返回按钮按下时将R.anim.nothing更改为R.anim.slide_in即可。 - Mukesh Rana
看起来你可以用0替换nothing.xml,像这样: overridePendingTransition(0,R.anim.slide_out); - TomCB
你可以尝试一下,但我猜在转换时会显示一些黑屏。虽然不确定,但我没有使用0应该有一些原因。你可以试试看,然后告诉我。谢谢..!! - Mukesh Rana
显示剩余3条评论

5

onBackPressed 中添加动画,这将使返回键点击时出现动画效果。

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(R.anim.slide_in, R.anim.slide_out);   
}

我正在使用操作栏上的返回按钮。我已经展示了相关代码。 - Tarun Sharma
抱歉,不如使用intent来替换finish。像这样: Intent intent = new Intent(this, PreviousActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); - Remees M Syde
但这将终止我的先前活动,所有数据都将丢失。 - Tarun Sharma
K. 伙计,你能否帮忙检查一下 onBackPressed() 函数调用是否正确?就像这样:case R.id.home: onBackPressed(); return true; 我不确定它是否有效,只是猜测。 - Remees M Syde
我想要在返回上一个活动时从左侧开始。 - Tarun Sharma

5

我使用了slide_in.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:fromXDelta="100%"
    android:toXDelta="0%" >

</translate>

slide_out.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:fromXDelta="0%"
    android:toXDelta="-100%" >

</translate>

slide_enter.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:fromXDelta="-100%"
    android:toXDelta="0%" >

</translate>

slide_exit.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:fromXDelta="0%"
    android:toXDelta="100%" >

</translate>

代码

        Intent i=new Intent(Authentication.this,Login.class);
        startActivity(i);
        overridePendingTransition(R.anim.slide_in, R.anim.slide_out);

返回上一页

         finish();
         overridePendingTransition(R.anim.slide_enter, R.anim.slide_exit);

20
抄袭回答你自己的问题是荒谬的。我甚至不知道你是如何获得这么多赞的。 - berserk
1
这个答案是正确的。但是 slide_out.xml 似乎与此无关。使用 android:fromXDelta="0%" android:toXDelta="0%" 也可以正常工作,而且没有任何可见的差异。 - Timo Bähr

2
我通过覆盖返回按钮的行为来解决了它。"最初的回答"
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    finish();
    return true;
}

0

我做过类似的事情,它可以正常工作,你可以用 startAnimation(your_xml) 替换 animate(),你还需要将活动背景设置为透明:

<item name="android:windowBackground">@android:color/transparent</item>

这个活动将会向下滑动,由于透明背景,在滑动的时候MainActivity将会可见。 编辑 - 带有工具栏返回按钮:

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mainlinear.animate()
                    .translationY(ScUtils.getScreenHeight(getApplicationContext()))
                    .setDuration(210)
                    .setInterpolator(new AccelerateInterpolator())
                    .setListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            ThemeActivity.super.onBackPressed();
                            overridePendingTransition(0, 0);
                           }
                          }).start();
                        }
                    });

我在这里使用操作栏返回按钮,所以请告诉我如何退出。 - Tarun Sharma

0

对于 Activity 进入动画,请在 onCreate(...) 函数中使用 overridePendingTransition(R.anim.slide_out, R.anim.slide_in);

对于退出动画,请在 onPause(...) 中放置相同的调用。


0

当您从一个Activity导航到另一个Activity时,弹出动画不会自动应用。

一旦将动画添加到导航XML中,必须将其添加到目标Activity,并重写Activity.finish()方法,使用applyPopAnimationsToPendingTransition来实现弹出退出动画。

 override fun finish() {
    super.finish()
    ActivityNavigator.applyPopAnimationsToPendingTransition(this)
}

0

我在我的操作栏上有一个返回/主页按钮,但是通过覆盖onBackPressedfinish无法捕获滑动动画。因此,我不得不从这里添加这个片段。如果使用与上面相同的slide_enterslide_exit

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    switch(id) {
        // back button
        case android.R.id.home:
            finish();
            overridePendingTransition(R.anim.slide_enter, R.anim.slide_exit);
            return true;
    }

    return super.onOptionsItemSelected(item);
}

如果有人发现它有用的话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接