我正在编写一个Android应用程序,我希望通过从屏幕底部到顶部的动画来显示活动。我可以使用此处的代码执行此操作:
然而,我无法做反之亦然的动画,其中活动会从屏幕的顶部滑动到底部消失。
我使用了上面链接中的代码;通过向上滑动显示活动,但当消失时,它会淡出,而不是滑到底部。
我甚至尝试将代码放在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();
}
答案 0 :(得分:73)
您需要从链接的问题中定义“向上滑动”动画,以及一些反向过程的新“向下滑动”动画。
要查看的动画的重要部分是fromYDelta
和toYDelta
值。这些定义了开始时的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()
而是使用每次屏幕转换时调用的方法:
onResume()
被调用onPause()
在活动即将被取消时被调用有关这些方法的详细信息,请查看Android开发者网站:
当您的屏幕显示时,它将从底部滑入。
当显示新屏幕时,屏幕将向下滑动。
答案 1 :(得分:7)
两种方法:
<强> 1。使用样式
假设您希望为所有活动实现此功能,请在基本主题中定义以下条目:
<item name="android:windowAnimationStyle">@style/ActivityAnimations</item>
然后定义以下样式:
<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()
覆盖结束():
@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);
}
答案 2 :(得分:4)
在主xml文件中。添加根标记的id并将其传递给function。像
/** 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);
}
}
答案 3 :(得分:1)
您可以通过覆盖onPause()中的Transition来反过来转换:
@Override
protected void onPause()
{
super.onPause();
overridePendingTransition(R.anim.appear_from_bottom, R.anim.disappear_to_bottom);
}