【问题标题】:Reveal Transition for replace Fragment显示替换片段的过渡
【发布时间】:2015-04-08 03:38:28
【问题描述】:

我有一个默认加载 Fragment StatsDetailFragment 的活动。

按下按钮后,我将使用以下代码将片段替换为另一个片段。

getSupportFragmentManager().beginTransaction()
                .replace(R.id.stats_detail_container, projectEntryListFragment, ProjectEntryListFragment.FRAGMENT_ID)
                .addToBackStack(FRAGMENT_CHART)
                .commit();

我正在使用自定义转换类为 ProjectEntryListFragment 设置输入转换

public class RevealTransition extends Visibility {
    private final Point mEpicenter;
    private final int mSmallRadius;
    private final int mBigRadius;
    private final long mDuration;

    public RevealTransition(Point epicenter, int smallRadius, int bigRadius, long duration) {
        mEpicenter = epicenter;
        mSmallRadius = smallRadius;
        mBigRadius = bigRadius;
        mDuration = duration;
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) {
        Animator animator = ViewAnimationUtils.createCircularReveal(view, mEpicenter.x, mEpicenter.y,
                mSmallRadius, mBigRadius);
        animator.setDuration(mDuration);
        return new WrapperAnimator(animator);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public Animator onDisappear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) {
        Animator animator = ViewAnimationUtils.createCircularReveal(view, mEpicenter.x, mEpicenter.y,
                mBigRadius, mSmallRadius);
        animator.setDuration(mDuration);
        return new WrapperAnimator(animator);
    }
}

过渡效果很好。但我面临的问题是,当在 ProjectEntryListFragment 上执行显示动画时,StatsDetailFragment 已经被删除,导致显示动画在空白背景上播放。我希望它在 StatsDetailFragment 上播放,这样 StatsDetailFragment 在 ProjectListFragment 上播放显示过渡时可见。

我尝试只添加新片段,但这只会让我在弹出后台堆栈时出错。

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.v4.app.Fragment.getAllowReturnTransitionOverlap()' on a null object reference

我们将不胜感激。

【问题讨论】:

    标签: android android-5.0-lollipop transitions android-transitions fragment-transitions


    【解决方案1】:

    为您的片段设置一个动画监听器。 在动画运行之前,为您的 rootview 提供您希望波纹的颜色。在 onAnimationEnd 和 onAnimationCanceled 中,为您的 rootview 提供您希望它具有的布局颜色。

    可见性“技巧”也有点不稳定(imo) 试试 ViewTreeObserver。

    希望这会有所帮助:)

    【讨论】:

    • 我用的不是动画,而是Transition。但是,我尝试设置 TransitionListeners。但这似乎不起作用。 ViewTreeObserver 也没有工作.. :(
    • 我遇到了同样的问题。这就是为什么我在过渡完成后对片段做了一点视觉技巧。它具有相同的视觉效果。在你的 oncreateview view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() {reveal(); ViewUtils.removeGlobalListeners(first, this); } }); 中运行这样的代码跨度>
    • 所以你将展示实现为动画?代码中的reveal()方法是我想的吗?
    • 我让它工作到一个扩展......我将一个转换侦听器附加到显示转换并在 onTransitionStart() 中我使用 fragment.getView() 获取根视图并将背景设置为一种颜色。现在的问题是我可以为 rootview 设置任何颜色,但不能设置透明颜色。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多