Android - 如何在按下默认后退按钮时为活动转换设置动画

时间:2012-08-21 02:37:50

标签: android animation button transition back

在我的活动中,我有一个按钮,其中包含以下点击侦听器:

final ImageButton startOverButton = (ImageButton) findViewById(R.id.start_over_button);
startOverButton.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(final View v) {

        finish();//go back to the previous Activity
        overridePendingTransition(R.anim.comming_in, R.anim.comming_out);
    }
});

它以我想要的方式动画返回上一个活动。但是,当用户按下Android默认后退按钮时,不会触发动画。我的问题是:我应该在哪里放置动画代码 overridePendingTransition(R.anim.comming_in,R.anim.comming_out); 以便在用户点击我的按钮时触发此动画默认的Android后退按钮?

作为一个天真的尝试,我试图将 overridePendingTransition(R.anim.comming_in,R.anim.comming_out); 代码行放在 onDestroy()方法,但它没有用。

提前谢谢!

4 个答案:

答案 0 :(得分:104)

也许你可以在活动中的onBackPressed()方法中完成这项工作。

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

答案 1 :(得分:15)

基本上覆盖onBackPressed是一种正确的方法,但不是从它调用finish(),我会说最好调用super.onBackPressed()然后添加overridePendingTransition,这样我们就可以更加符合继承规则了。 / p>

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

答案 2 :(得分:4)

即使覆盖onBackPressed()是一个不错的选择,我建议覆盖finish()方法,以防活动以其他方式完成,例如导航操作或任何其他视图操作"破坏"活动:

@Override public void finish() {
   super.finish();
   overridePendingTransition(0,0);
}

我们需要考虑在按下后退按钮后触发此方法,所以我们很高兴: - )

更新:此外,如果我们在其中使用片段,覆盖onBackPressed()可能会搞乱活动,因为我们可能不希望每次都覆盖转换背部被压了。

答案 3 :(得分:2)

如果你使用片段,你可以这样继续:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setCustomAnimations(R.anim.anim_slide_in_left, R.anim.anim_slide_out_left, R.anim.anim_slide_out_right, R.anim.anim_slide_in_right);
transaction.replace(R.id.fragment_container, new YourClassFragment);
transaction.addToBackStack(null);
transaction.commit();

anim_slide_in_left

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="500"
    android:interpolator="@android:interpolator/decelerate_quint"
    android:fromXDelta="100%p"
    android:toXDelta="0%p" >
  </translate>
 </set>

anim_slide_out_left

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="500"
    android:interpolator="@android:interpolator/decelerate_quint"
    android:fromXDelta="0%p"
    android:toXDelta="-100%p" >
  </translate>
 </set>

anim_slide_out_right

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
 <translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:interpolator="@android:interpolator/decelerate_quint"
    android:fromXDelta="-100%p"
    android:toXDelta="0%p" >
 </translate>
</set>

anim_slide_in_right

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android" >
  <translate
    android:duration="@android:integer/config_mediumAnimTime"
    android:interpolator="@android:interpolator/decelerate_quint"
    android:fromXDelta="0%p"
    android:toXDelta="100%p" >
  </translate>
 </set>