【问题标题】:onBackPressed() animation issueonBackPressed() 动画问题
【发布时间】:2015-12-24 22:18:34
【问题描述】:

我正在尝试重写 onBackPressed() 方法来设置我自己的动画,但实际上它从我的活动滑到同一个活动,然后显示新活动。

这是我的代码:

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

下面是动画:

向右滑出:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate android:duration="400" android:fromXDelta="0%" android:toXDelta="100%" />
<alpha android:duration="400" android:fromAlpha="1.0" android:toAlpha="0.0" />
</set>

向左滑动:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator= "false" >
<translate android:duration = "400" android:fromXDelta = "-100%" android:toXDelta = "0%" />
<alpha android:duration = "400" android:fromAlpha = "0.0" android:toAlpha = "1.0" />
</set>

感谢你们的帮助。

【问题讨论】:

标签: java android animation onbackpressed


【解决方案1】:

super.onBackPressed();删除这一行再工作

这是翻译 slide_in_from_left

   <set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="500"
    android:fromXDelta="-300%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
  </set>

slide_in_from_right

 <set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="500"
    android:fromXDelta="300%"
    android:fromYDelta="0%"
    android:toXDelta="0%"
    android:toYDelta="0%" />
  </set>

slide_out_to_left

 <set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="500"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="-300%"
    android:toYDelta="0%" />
  </set>

slide_out_to_right

 <set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<translate
    android:duration="500"
    android:fromXDelta="0%"
    android:fromYDelta="0%"
    android:toXDelta="300%"
    android:toYDelta="0%" />
  </set>

/

@Override
public void onBackPressed()
{

    overridePendingTransition(R.anim.slide_out_right, R.anim.slide_in_left);
   // add which work after you back.
}

并添加您正在使用的功能。

【讨论】:

  • 我试图删除 super.onBackPressed(); 但后退按钮不再起作用:/
  • 我所做的是:Intent intent = new Intent(MainMenu.this, SplashScreen.class); startActivity(intent); overridePendingTransition(R.anim.slide_out_right, R.anim.slide_in_left); 但我仍然有同样的问题
【解决方案2】:

如果这对您来说很好,请尝试一次,然后您可能会遇到其他部分的问题

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" />

slide_up_dialog.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" />

在你的活动中添加这个

@Override
    public void onBackPressed() {
        finish();
        overridePendingTransition(R.anim.slide_up_dialog, R.anim.slide_out_down);
    }

【讨论】:

  • 它改变了动画但仍然是同样的问题,我认为问题不是来自动画,但我尝试了一些其他动画,奇怪的是它可以工作 Oo。
【解决方案3】:

编辑:这是来自Android Developers Blog - Back and other hard keys: three stories的答案

如果您要调查 Android 平台中的基础应用程序, 你会注意到一个相当普遍的模式:添加一点魔法 拦截 BACK 键并做一些不同的事情。要做到这一点, 魔法需要看起来像这样:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

如何在Activity中拦截BACK键也是常见的一种 我们看到开发人员提出的问题,因此从 2.0 开始,我们有了一个新的小 API 使这更简单,更容易发现和正确:

@Override
public void onBackPressed() {
// do something on back.
return;
}

如果这就是你所关心的,而且你并不担心 支持2.0之前的平台版本,则可以停止 这里。否则,请继续阅读。

所以你的代码应该是这样的

@Override
public void onBackPressed()
{

   overridePendingTransition(R.anim.slide_out_right, R.anim.slide_in_left);
   finish();
}

和

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            overridePendingTransition(R.anim.slide_out_right, R.anim.slide_in_left);
            finish();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

【讨论】:

  • 也试过了,同样的问题发生了,就像两个动画都适用于同一个活动,然后他改变了活动。 ://
  • 谢谢,我终于成功了,我刚刚更改了我正在使用的动画,这很奇怪,因为它不应该那样工作,但无论如何感谢您的帮助:)
【解决方案4】:

你可以尝试解决这个问题:

@Override
public void onBackPressed()
{
    finish();
    overridePendingTransition(R.anim.slide_out_right, R.anim.slide_in_left);


}

【讨论】:

  • 我刚刚试过了,还是同样的问题。我真的不明白为什么:/
  • @primaëlquemerais 这是部分好的解决方案,但onKeyDown() 监听器仍在工作,您可能还需要更改它。检查我的答案和评论中的链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多