【发布时间】:2017-02-07 20:59:12
【问题描述】:
我想在从片段 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 立即消失,并且正在播放 fragmentB 的进入动画。
有什么想法吗?
我尝试增加退出动画的持续时间,但无济于事。
【问题讨论】:
标签: java android android-fragments transitions