android - 将 transitionSet 应用于 Fragment 中的单个 View content transition 会产生重复的 View 效果

标签 android android-fragments android-transitions

我的目标是在 fragment 之间创建一个内容转换,其中 Fade() 和 Slide() 仅应用于 fragment 的一个 View 。当执行转换(在本例中为 exitTransition)时,视觉效果不是 View 同时滑动和淡入淡出,而是 View 被复制,一个副本滑动,另一个副本淡出。

部分代码:

Fragment currentFragment = getSupportFragmentManager().getFragments().get(0);
Fragment fragment = EmailSearchFragment.newInstance();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    fragment.setEnterTransition(new Slide(Gravity.RIGHT)); 
    currentFragment.setExitTransition(TransitionInflater.from(this).inflateTransition(R.transition.slide_and_fade));             
}

getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container, fragment)
    .addToBackStack(null)
    .commit();

这里是过渡:

public class DetailsTransition extends TransitionSet {
    public DetailsTransition() {
        init();
    }

    /**
     * This constructor allows us to use this transition in XML
     */
    public SlideAndFadeTransitionSet(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setOrdering(ORDERING_TOGETHER);
        addTransition(new Fade()).
        addTransition(new Slide(Gravity.TOP));
    }
}

并且,这里的 xml 针对一个单一 View 进行转换:

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android" class="com.adidas.connect.app.transition.DetailsTransition">
    <targets>
        <target android:targetId="@id/social_buttons"/>
    </targets>
</transition>

我也尝试过在 XML 中使用过渡集,但我得到了相同的结果,所以我将过渡集移动到一个新类,以确保针对单个 View 的 xml 语法没有问题。

有人做了这个工作吗?

提前致谢!

最佳答案

作为解决方法,我创建了自己的 CustomTransitions,其中应用了两种效果:

public class Stack extends Visibility {

    public Stack(Context context, AttributeSet attributteSet) {
        super(context, attributteSet);
    }

    @Override
    public Animator onDisappear(ViewGroup sceneRoot, View view,
                                TransitionValues startValues, TransitionValues endValues) {
        if (startValues == null) {
            return null;
        }

        Animator slideTop = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, 0, -sceneRoot.getHeight());
        Animator fadeOut = ObjectAnimator.ofFloat(view, View.ALPHA, 1, 0);

        AnimatorSet animSet = new AnimatorSet();
        animSet.play(slideTop)
                .with(fadeOut);

        return  animSet;
    }

    @Override
        public Animator onAppear(ViewGroup sceneRoot, View view, TransitionValues startValues, TransitionValues endValues) {
        ...
    }
}

现在可以了。

关于android - 将 transitionSet 应用于 Fragment 中的单个 View content transition 会产生重复的 View 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36134931/

相关文章:

android - Java Robotium Android - 在两个不同的设备上同时运行相同的测试

android - 在 fragment 中使用 onConfigurationChanged

java - 更改已在堆栈中的 fragment 的动画

android - makeSceneTransitionAnimation 不工作

android - 谁能推荐 ICS 的开源号码选择器?

android - 为汽车构建 AOSP 后未生成用户数据图像

android - 如何将 ListView 行中的 TextView 中的值放入 fragment

java - Android - 如何从 Activity 中调用 fragment 中的方法

android - 使 Activity 从上到下动画

Android Espresso IdlingResources 和 fragment/Activity 转换