考虑我有以下层次结构:
以下用例存在:
需要遵循转换行为:
用例1 + 3: 我希望旧活动向左滑动,新活动从右侧滑入
用例2:用例2: 我希望旧活动向右滑动,新活动从左侧滑入我尝试了很多方法来实现overridePendingTransition
,但没有任何组合正常工作......我遇到了类似以下内容:
public class BaseActivity extends Activity
{
@Override
protected void onPause()
{
adjustWindowAnimation(this, false);
super.onPause();
}
@Override
protected void onResume()
{
adjustWindowAnimation(this, true);
super.onResume();
}
protected void adjustWindowAnimation(Activity parent, boolean start)
{
if (start)
parent.overridePendingTransition(R.anim.slide_from_right_in, R.anim.slide_to_left_out);
else
parent.overridePendingTransition(R.anim.slide_from_left_in, R.anim.slide_to_right_out);
}
// @Override
// protected void onCreate(Bundle savedInstanceState)
// {
// adjustWindowAnimation(this, true);
// super.onCreate(savedInstanceState);
// }
// @Override
// protected void onRestoreInstanceState(Bundle savedInstanceState)
// {
// adjustWindowAnimation(this, true);
// super.onRestoreInstanceState(savedInstanceState);
// }
// @Override
// protected void onStart()
// {
// super.onStart();
// adjustWindowAnimation(this, true);
// }
// @Override
// protected void onNewIntent(Intent intent)
// {
// adjustWindowAnimation(this, true);
// super.onNewIntent(intent);
// }
// @Override
// protected void onStop()
// {
// adjustWindowAnimation(this, false);
// super.onStop();
// }
// @Override
// public void finish()
// {
// adjustWindowAnimation(this, false);
// super.finish();
// }
// @Override
// protected void onDestroy()
// {
// Crouton.clearCroutonsForActivity(this);
// super.onDestroy();
// }
// @Override
// public void onBackPressed()
// {
// adjustWindowAnimation(this, false);
// super.onBackPressed();
// }
}
动画(这些应该可以正常工作):
SlideFromLeftIn:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="-100%" android:toXDelta="0"
android:duration="@android:integer/config_shortAnimTime" />
</set>
SlideFromRightIn:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="100%" android:toXDelta="0"
android:duration="@android:integer/config_shortAnimTime" />
</set>
SlideToLeftOut:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0%" android:toXDelta="-100%"
android:duration="@android:integer/config_shortAnimTime" />
</set>
SlideToRightOut:
<set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
<translate android:fromXDelta="0" android:toXDelta="100%"
android:duration="@android:integer/config_shortAnimTime" />
</set>
答案 0 :(得分:0)
要实现此类行为,您需要知道暂停和恢复的原因。就像它的另一个活动即将展示一样,然后app在onPause()
中播放一个动画,但如果不是(所以它的任何其他原因),那么你播放另一个动画。在onResume()
中相同 - 如果某些活动已开始,现在已完成,这就是为什么onResume()
已触发,那么您将播放一个相应的动画,但如果onResume(
)未通过完成活动触发(返回到例如,在打电话之后的应用程序)然后你播放另一个动画。
我用以下方式做了类似的事情:
public class MainMenuActivity extends Activity{
...
protected boolean isGoingToAlarmActivity;
protected boolean isGoingToSettingsActivity;
@Override
protected void onPause() {
// for animation choose
if (isGoingToAlarmActivity){
isGoingToAlarmActivity = false;
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
}
else if (isGoingToSettingsActivity){
isGoingToSettingsActivity = false;
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
}
super.onPause();
}
public void onAlarmButtonClick (View button){
isGoingToAlarmActivity = true;
startActivity(new Intent(this, AlarmActivity.class));
}
public void onSettingsButtonClick (View button){
isGoingToSettingsActivity = true;
startActivity(new Intent(this, SettingsActivity.class));
}
...
}
项目菜单,警报和设置中只有3个活动。所以它进入动画“从右到左”的设置,并在返回菜单时反转,反之亦然。在AlarmActivity中:
@Override
protected void onPause() {
// for animation choose
if (isFinishing())
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
super.onPause();
}
并在SettingsActivity中:
@Override
protected void onPause() {
// for animation choose
if (isFinishing())
overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
super.onPause();
}
注意:Activity的isFinishing()方法表示活动正在完成,例如当用户点击“返回”按钮时(可能有其他原因但在大多数情况下都是如此)。