我想从上至下在上一个片段的上方制作一个新片段的动画。
不幸的是,随着新片段的动画化,我当前的实现将上一个片段向上推,就像这样:
https://i.imgur.com/IgMUamp.png
我想做的是使新片段在前一个片段的上方 动画,如下所示:
https://i.imgur.com/DTrEfcm.png
这是我的代码现在的样子:
private void pushFragment(String fragmentTag, Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.setCustomAnimations(R.anim.anim_in_test, R.anim.anim_out_test);
fragmentTransaction.replace(
R.id.fragment_container,
fragment,
fragmentTag);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commitAllowingStateLoss();
}
这里是anim_in_test.xml
:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator">
<translate
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
这是anim_out_test.xml
:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="@android:integer/config_longAnimTime"
android:fromYDelta="0%p"
android:toYDelta="-100%p"
/>
</set>
要使此功能正常工作,我需要更改什么?
答案 0 :(得分:0)
setCustomAnimations(int enter, int exit)
退出动画应该为空(因为您需要在显示新片段时将旧片段留在屏幕上),但是如果您将0传递给第二个参数视图,则不显示动画。那就是为什么我添加空的alpha动画,它将alpha从1更改为1。
fragmentTransaction.setCustomAnimations(R.anim.anim_in_test, R.anim.anim_out_test);
anim_out_test.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:duration="@android:integer/config_longAnimTime"
android:fromAlpha="1"
android:toAlpha="1" />
</set>
但是在那一点上它不起作用,因为android在旧片段下面绘制新片段并为其设置动画。如果使片段背景透明,则可以看到它。
要解决此问题,我在片段的根视图上使用setZ(z)
,setElevation(z)
或setTranslationZ(z)
方法。似乎所有人都在工作。新片段的Z
值应大于旧片段Z
的值。
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.view, container, false);
view.setZ(value);
这是结果:
它有效,但我不知道该解决方案的副作用。在Android 4上,我认为可以通过自定义ViewGroup
作为片段容器来完成,它以相反的顺序绘制子代。
答案 1 :(得分:-1)
只需使用添加片段而不是替换片段