现场。在视图下滑动过渡

时间:2017-07-25 12:55:45

标签: android animation android-transitions

看看样本。我有两个场景,一个是开始&结束场景。 开始场景的布局:

<?xml version="1.0" encoding="utf-8"?>
<merge
    android:id="@+id/vgRoot"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:parentTag="RelativeLayout"
    tools:ignore="HardcodedText"
    >

    <Button
        android:id="@+id/btn1"
        style="@style/Widget.AppCompat.Button.Borderless"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/cardView"
        android:text="Button"
        android:layout_centerHorizontal="true"
        />

    <Button
        android:id="@+id/btnGo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/btn1"
        android:text="@string/go"
        android:layout_centerHorizontal="true"
        />

    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_margin="16dp"
        android:translationZ="3dp"
        >

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:background="#3829AB"
            android:padding="32dp"
            >

            <TextView
                android:id="@+id/tvText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Text Title"
                android:textAppearance="?android:textAppearanceMedium"
                android:textColor="@android:color/white"
                />

        </FrameLayout>

    </android.support.v7.widget.CardView>

</merge>

我已应用btn1滑动转换,cardViewcontainer,它们会更改其边界,tvText作为CardView的正文。

结束场景:

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:ignore="HardcodedText"
    tools:parentTag="RelativeLayout"
    >

    <android.support.v7.widget.CardView
        android:id="@+id/cardView"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        app:cardCornerRadius="0dp"
        >

        <FrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:background="#3829AB"
            android:orientation="vertical"
            >

            <TextView
                android:id="@+id/tvText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Text Title"
                android:textAppearance="?android:textAppearanceMedium"
                android:textColor="@android:color/white"
                />

        </FrameLayout>

    </android.support.v7.widget.CardView>

</merge>

带转换的片段代码:

public class FragmentStartTransition extends Fragment {
    @BindView(R.id.btnGo) View btnGo;
    @BindView(R.id.vgRoot) ViewGroup vgRoot;

    private Unbinder unbinder;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        ViewGroup view = (ViewGroup) inflater.inflate(R.layout.fragment_start_transition, container, false);
        unbinder = bind(this, view);
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        btnGo.setOnClickListener(btnGo.setOnClickListener(v -> moveNext());
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        unbinder.unbind();
    }

    private void moveNext() {
        Scene scene = Scene.getSceneForLayout(vgRoot, R.layout.scene_end, getContext());
        TransitionManager.go(scene, getTransition());
    }

    private Transition getTransition() {
        Slide slide = new Slide(Gravity.TOP);
        slide.addTarget(R.id.btn1);

        ChangeBounds changeBounds = new ChangeBounds();
        changeBounds.addTarget(R.id.cardView);
        changeBounds.addTarget(R.id.container);
        changeBounds.addTarget(R.id.tvText);

        return new TransitionSet()
                .setOrdering(TransitionSet.ORDERING_TOGETHER)
                .addTransition(slide)
                .addTransition(changeBounds)
                .setDuration(1500);
    }
}

fragment_start_transition:

<RelativeLayout
    android:id="@+id/vgRoot"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:ignore="HardcodedText"
    >

    <include layout="@layout/scene_start"/>

</RelativeLayout>

结果动画:

enter image description here

我想在<{1}}和cardView 下滑动btn1 。如您所见,container位于根布局的末尾,位于按钮之上。但是在结果动画中,它滑过cardView。我可以以某种方式控制动画视图之间的这种z轴关系吗?

尝试cardView - 它没有帮助

定义应该是简单的解决方案,但我无法找到它 伙计们,我需要你的帮助。

更新 这是因为框架在场景容器视图叠加层上绘制了幻灯片过渡,请查看cardView.bringToFront() class:

android.transition.Visibility

但问题仍然存在。

1 个答案:

答案 0 :(得分:1)

我刚刚解决了同样的问题。诀窍似乎是不让Visibility类将滑动(消失)视图复制到场景根的叠加层,这显然会显示在场景中的任何其他视图上方。

如果实际从视图层次结构中删除了滑动视图,则该视图仅复制到叠加层。如果我将视图保留在场景中但将visibility设置为GONE,则会重新使用相同的视图,而不是将其复制到叠加层。然后它会在它的兄弟视图下方滑动(如果它在它们下面)(因此你的cardView.bringToFront()应该有用)。