我想在从片段A移动到片段B
时有自定义动画 FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content, fragmentA).commit();
后
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content, fragmentB).addToBackStack(null).commit();
我不能使用ft.setCustomAnimations(),因为这将为整个fragmentA设置动画,我想为其中的每个单独视图设置动画。 这意味着我需要使用转换的AFAIK
所以我的片段有
Transition transition = new MyTransition();
setEnterTransition(transition);
setReenterTransition(transition);
//setReturnTransition(transition);
setExitTransition(transition);
所有这一切都很好,因为转换在进入和退出时都会运行
我的过渡课
private class MyTransition extends Transition
{
private Interpolator accelerate = new AccelerateInterpolator();
private Interpolator decelerate = new DecelerateInterpolator();
boolean entering = false;
@Override
public void captureStartValues(TransitionValues transitionValues)
{
}
@Override
public void captureEndValues(TransitionValues transitionValues)
{
}
private void showing(boolean showing)
{
if (entering == showing) return;
entering = showing;
if (entering)
{
setDuration(Application.ANIMATION_DURATION);
setInterpolator(decelerate);
}
else
{
setDuration(Application.ANIMATION_DURATION);
setInterpolator(accelerate);
}
}
@Nullable
@Override
public Animator createAnimator(@NonNull ViewGroup sceneRoot, @Nullable TransitionValues startValues, @Nullable TransitionValues endValues)
{
if (endValues != null)
{
showing(true);
View target = endValues.view;
switch(target.getId())
{
case R.id.fab:
return ObjectAnimator.ofPropertyValuesHolder(target,
PropertyValuesHolder.ofFloat("scaleX", 1f),
PropertyValuesHolder.ofFloat("scaleY", 1f));
case R.id.main_player_tools:
return ObjectAnimator.ofFloat(target, "translationX", 0);
case R.id.main_score:
return ObjectAnimator.ofFloat(target, "translationY", 0);
case R.id.main_custom:
return ObjectAnimator.ofFloat(target, "translationX", 0);
case R.id.main_dice:
return ObjectAnimator.ofFloat(target, "translationY", 0);
default:
break;
}
}
else if (startValues != null)
{
showing(false);
View target = startValues.view;
switch(target.getId())
{
case R.id.fab:
return ObjectAnimator.ofPropertyValuesHolder(target,
PropertyValuesHolder.ofFloat("scaleX", 0f),
PropertyValuesHolder.ofFloat("scaleY", 0f));
case R.id.main_player_tools:
return ObjectAnimator.ofFloat(target, "translationX", -target.getWidth());
case R.id.main_score:
return ObjectAnimator.ofFloat(target, "translationY", -target.getHeight());
case R.id.main_custom:
return ObjectAnimator.ofFloat(target, "translationX", target.getWidth());
case R.id.main_dice:
return ObjectAnimator.ofFloat(target, "translationY", target.getHeight());
default:
break;
}
}
return null;
}
}
使用调试器运行代码似乎正确进行:
当启动fragmentA时,我会看到createAnimator中的代码,并相应地创建每个动画师。当启动fragmentB时,一切似乎都执行得很好。 但是在手机上我只看到了输入动画。当它开始退出动画时,fragmentA会立即消失,并且片段B的输入动画正在播放。
任何想法为什么?
我试图增加退出动画的持续时间,但无济于事。
答案 0 :(得分:1)
原因是我没有捕获值,也没有覆盖getTransitionProperties。
这导致isTransitionRequired返回false并导致动画被忽略。
捕捉数值时要小心。 如果起始值和结束值相同,则不会执行转换。