当前位置: 首页 > 知识库问答 >
问题:

FragmentTransaction动画滑入顶部

瞿兴朝
2023-03-14

我正在尝试使用FragmentTransaction实现以下效果。设置自定义动画。

  1. 片段A正在显示
  2. 将片段A替换为片段B。在替换过程中,片段A应该保持可见。片段B应该从右侧滑入。片段B应该在片段A的顶部滑动。

我在动画设置中获得幻灯片没有问题。我的问题是,当幻灯片在动画中运行时,我不知道如何使片段A停留在它所在的位置,并处于片段B之下。不管我怎么做,碎片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,因为我实际上不希望片段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" />

没有什么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" />

共有3个答案

易阳云
2023-03-14

我找到了一个适合我的解决方案。最后,我用了一个带有FragmentStatePagerAdapter的ViewPager。ViewPager提供滑动行为,FragmentStatePagerAdapter在片段中交换。最后一个技巧是使用PageTransformer,让一个页面在进入页面的“下方”可见。PageTransformer会覆盖ViewPager在页面之间的默认转换。下面是一个PageTransformer示例,它通过在左侧页面上进行翻译和少量缩放来实现效果。

public class ScalePageTransformer implements PageTransformer {
    private static final float SCALE_FACTOR = 0.95f;

    private final ViewPager mViewPager;

    public ScalePageTransformer(ViewPager viewPager) {
            this.mViewPager = viewPager;
    }

    @SuppressLint("NewApi")
    @Override
    public void transformPage(View page, float position) {
        if (position <= 0) {
            // apply zoom effect and offset translation only for pages to
            // the left
            final float transformValue = Math.abs(Math.abs(position) - 1) * (1.0f - SCALE_FACTOR) + SCALE_FACTOR;
            int pageWidth = mViewPager.getWidth();
            final float translateValue = position * -pageWidth;
            page.setScaleX(transformValue);
            page.setScaleY(transformValue);
            if (translateValue > -pageWidth) {
                page.setTranslationX(translateValue);
            } else {
                page.setTranslationX(0);
            }
        }
    }

}
白永昌
2023-03-14

我不知道你是否还需要一个答案,但我最近也需要这样做,我找到了一种方法来做你想做的事。

我做了这样的东西:

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

MyFragment next = getMyFragment();

ft.add(R.id.MyLayout,next);
ft.setCustomAnimations(R.anim.slide_in_right,0);
ft.show(next);
ft.commit();

我在框架布局中显示我的片段。

它可以很好地工作,但在我看来,旧的片段仍然存在,我让android像他希望的那样管理它,因为如果我把:

ft.remove(myolderFrag);

它在动画期间不显示。

slide_in_right.xml

    <?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<translate android:duration="150" android:fromXDelta="100%p" 
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="0" />
 </set>
何建中
2023-03-14

从片段库1.2.0开始,修复此问题的推荐方法是将FragmentContainerViewFragmentTransaction一起使用。setCustomAnimations()

根据留档:

对于FragmentContainerView,使用退出动画的片段会在所有其他片段之前绘制。这可确保退出的片段不会出现在视图顶部。

解决此问题的步骤是:

  1. 将片段库更新到1.2.0或更多androidx.fragment: fraank: 1.2.0
  2. 替换您的xml片段容器(

从Lollipop开始,你可以增加进入片段的反翻译Z。它将出现在退出的页面上方。

例如:

@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;
}

 类似资料:
  • 我有一个,现在我已经将OnClickListener添加到这些TextViews和ImageViews中。 问题:我已经把这个应用到线性布局中,但发生的是,当我点击next按钮时,当前问题将向左滑动,然后出现一个空白屏幕,然后它将滑入并显示下一个问题,但我希望当当前问题滑出时,它应该紧跟在下一个问题之后。

  • 我查看了一些教程,了解片段之间的动画事务。我用这种方法制作动画,效果很好: 但是我想反转这个动画:旧片段滑出到左边,新片段滑入到右边,但是文件的值似乎对我的作用域没有用处。 我怎么能做到呢?

  • 我已经编写了一些代码,可以从高度图中渲染3D世界,现在我也编写了允许行走的代码。问题是,当高度增加时,动画几乎“跳跃”,因为每个单元都相当大。有没有一种简单的方法可以让动画更流畅?(一般来说,我对OpenGL和3D渲染非常陌生,所以我不想讨论插值和更复杂的事情。)

  • 本文向大家介绍Android仿京东顶部搜索框滑动伸缩动画效果,包括了Android仿京东顶部搜索框滑动伸缩动画效果的使用技巧和注意事项,需要的朋友参考一下 最近使用京东发现,京东顶部的搜索框有一个新的伸缩效果,根据用户的手势滑动,伸缩搜索框。觉得效果还不错,就看了下其他的应用有没有这种伸缩的效果,发现安居客也使用了类似的一种效果,然后就想着实现这样的一种动画效果。 首先看下第三方的效果图: 京东效

  • 我试图为我的实现一个平滑的动画,但是当我增加时间(30秒)时,动画不再平滑。 5秒钟的例子: 30秒的例子: 我的进步背景: 我的进度布局: 我的动画制作方法:

  • 如何在侧滑块中制作一些不同类型的动画。有图书馆吗?如果有图书馆,请提供我。