overridePendingTransition 用于平滑地滑入和滑出活动
Posted
技术标签:
【中文标题】overridePendingTransition 用于平滑地滑入和滑出活动【英文标题】:overridePendingTransition for sliding activities in and out smoothly 【发布时间】:2014-01-08 13:21:44 【问题描述】:我无法弄清楚如何通过按一下按钮将活动滑入和滑出。我想要的是用户按下按钮然后屏幕滑动。我想要的方式是让第一个活动(带有按钮的活动)向左滑出,而新的第二个活动从右侧滑入。
使用下面的代码,当单击按钮时,当我希望第一个活动向左滑出时,它会向右滑出。然后当它完成滑动时,剩下的只是一瞬间黑屏,然后第二个活动只是出现并且没有滑入。
所以第一个活动滑出不正确的方向,下一个活动只是出现而不是滑动。我究竟做错了什么?我很难理解 XML 文件,所以听到的是下面所有内容的代码。
第一次活动
@Override
public void onCreate(Bundle savedInstanceState)
playBtn.setOnClickListener(new OnClickListener()
public void onClick(View v)
Intent intent = new Intent(MainMenu.this, Levels.class);
startActivity(intent);
overridePendingTransition(R.anim.enter_from_right, R.anim.exit_out_left);
);
第二次活动
@Override
public void onCreate(Bundle savedInstanceState)
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.levels);
overridePendingTransition(R.anim.enter_from_left, R.anim.exit_out_right);
所以我认为我的一些 XML 文件可能不正确。他们来了。
enter_from_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="100%"
android:toXDelta="0%" >
</translate>
</set>
enter_from_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="-100%"
android:toXDelta="0%" >
</translate>
</set>
exit_out_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="0%"
android:toXDelta="-100%" >
</translate>
</set>
exit_out_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set
xmlns:android="http://schemas.android.com/apk/res/android" >
<translate
android:duration="600"
android:fromXDelta="0%"
android:toXDelta="100%" >
</translate>
</set>
编辑
从第二个活动中删除overridePendingTransition()
使得第一个活动滑到左边,这就是我想要的。但是,当第一个活动滑开时,它仍然只是显示黑屏,而不是第二个活动从右侧滑入。
【问题讨论】:
你应该只需要覆盖一次动画,所以只有在推送新活动时。如果您从 onCreate 中删除覆盖,它应该可以工作 @panini 查看我的开篇文章的编辑。您帮助解决了一个问题。 我认为在您的 enter_from_right 动画中,您的 fromXDelta 应该是 100%,而不是 -100% 现在完美运行。请随意将此作为答案,以便我接受。 【参考方案1】:您无需在startActivity()
和新活动onCreate()
中覆盖动画,只需在startActivity()
调用之后覆盖动画即可。
您为overridePendingTransition(int enterAnim, int exitAnim)
提供的两个int
s 对应于两个动画——删除旧的Activity
并添加新的。
对于您的第二个问题,我相信您的 fromXDelta 设置错误,-100% 应该一直远离屏幕的左侧,而不是右侧,因此将其更改为100% 应该修复它。
【讨论】:
overridePendingTransition 有 enterAnim 作为第一个参数。 看看这里,一些可能很重要/有帮助的澄清:***.com/a/23752530/826946【参考方案2】:看看我的要点,它工作得很好:
1.覆盖CommonActivity的startActivity并完成
@Override
public void startActivity(Intent intent)
super.startActivity(intent);
overridePendingTransition(R.anim.from_right_in, R.anim.from_left_out);
@Override
public void finish()
super.finish();
overridePendingTransition(R.anim.from_left_in, R.anim.from_right_out);
2.from_left_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p"
android:toXDelta="0"
android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
3.from_right_in.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="100%p"
android:toXDelta="0" android:interpolator="@android:interpolator/accelerate_decelerate"
android:duration="300"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="300" />
</set>
4.from_left_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:toXDelta="-100%p"
android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
5.from_right_out.xml
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="0"
android:toXDelta="100%p"
android:duration="300"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="300" />
</set>
要点链接:https://gist.github.com/JagieChen/f5cc44bf663f3722bd19097be47ccf9b
【讨论】:
【参考方案3】:不仅在 enter_from_right 动画中存在错误,它的 fromXDelta 应该是 100% 而不是 -100%,而且即使在 enter_from_left 动画中,也应该是 -100% 而不是 100% 的 fromXDelta。
干杯,
【讨论】:
【参考方案4】:在您的代码中将fromXDelta
从enter_from_left
和fromXDelta
更改为100%
从enter_from_right
更改为100%
,这将为您提供正确的滑动动画。
【讨论】:
【参考方案5】:此时不要忘记支点! fE。从上到下移动。 pivotY 是 100% 的底部,所以你的 0% 在底部,而 -100% 在上升,你看不到它。将枢轴设置为边框时会更方便。
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true"
android:shareInterpolator="false">
<translate
android:duration="800"
android:fromYDelta="-100%"
android:toYDelta="0%"
android:interpolator="@android:anim/bounce_interpolator"
android:pivotX="50%"
android:pivotY="100%"/>
</set>
【讨论】:
以上是关于overridePendingTransition 用于平滑地滑入和滑出活动的主要内容,如果未能解决你的问题,请参考以下文章
窗体切换动画 overridePendingTransition
关于Activity切换动画(overridePendingTransition)的黑色背景问题