gpt4 book ai didi

android - FragmentTransaction 动画滑入顶部

转载 作者:IT老高 更新时间:2023-10-28 13:16:12 26 4
gpt4 key购买 nike

我正在尝试使用 FragmentTransaction.setCustomAnimations 实现以下效果。

  1. fragment A 正在显示
  2. 用 Fragment B 替换 Fragment A。在替换过程中,Fragment A 应该保持可见。 fragment B 应该从右侧滑入。 fragment B 应该滑入 fragment A 的顶部。

在动画设置中获取幻灯片没有问题。我的问题是我无法弄清楚如何在动画幻灯片运行时使 fragment A 停留在原处并位于 fragment B 下。无论我做什么,似乎 fragment A 都在顶部。

我怎样才能做到这一点?

这是 FragmentTransaction 代码:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.slide_in_right, R.anim.nothing, R.anim.nothing,
R.anim.slide_out_right);
ft.replace(R.id.fragment_content, fragment, name);
ft.addToBackStack(name);
ft.commit();

如您所见,我为“out”动画定义了一个动画 R.anim.nothing,因为我实际上不希望 Fragment A 做任何事情,而只是在事务期间保持原位。

这里是动画资源:

slide_in_right.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromXDelta="100%p"
android:toXDelta="0"
android:zAdjustment="top" />

nothing.xml

<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@android:integer/config_mediumAnimTime"
android:fromAlpha="1.0"
android:toAlpha="1.0"
android:zAdjustment="bottom" />

最佳答案

更新(2020 年 6 月 16 日)

从 fragment 库开始1.2.0解决此问题的推荐方法是使用 FragmentContainerViewFragmentTransaction.setCustomAnimations() .

根据documentation :

Fragments using exit animations are drawn before all others for FragmentContainerView. This ensures that exiting Fragments do not appear on top of the view.

解决此问题的步骤是:

  1. 将 fragment 库更新到 1.2.0 或更高版本 androidx.fragment:fragment:1.2.0 ;
  2. 将您的 xml fragment 容器(<fragment><FrameLayout> 或其他)替换为 <androidx.fragment.app.FragmentContainerView> ;
  3. 使用 FragmentTransaction.setCustomAnimations()为您的 fragment 过渡设置动画。

上一个答案(2015 年 11 月 19 日)

从 Lollipop 开始,您可以增加输入 fragment 的 de translationZ。它将出现在现有的上方。

例如:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ViewCompat.setTranslationZ(getView(), 100.f);
}

如果您只想在动画期间修改 translationZ 值,您应该执行以下操作:

@Override
public Animation onCreateAnimation(int transit, final boolean enter, int nextAnim) {
Animation nextAnimation = AnimationUtils.loadAnimation(getContext(), nextAnim);
nextAnimation.setAnimationListener(new Animation.AnimationListener() {

private float mOldTranslationZ;

@Override
public void onAnimationStart(Animation animation) {
if (getView() != null && enter) {
mOldTranslationZ = ViewCompat.getTranslationZ(getView());
ViewCompat.setTranslationZ(getView(), 100.f);
}
}

@Override
public void onAnimationEnd(Animation animation) {
if (getView() != null && enter) {
ViewCompat.setTranslationZ(getView(), mOldTranslationZ);
}
}

@Override
public void onAnimationRepeat(Animation animation) {
}
});
return nextAnimation;
}

关于android - FragmentTransaction 动画滑入顶部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13005961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com