片段中的共享元素和内容转换

时间:2015-02-24 13:06:00

标签: android android-transitions

我有以下问题:

我正在尝试从Fragment A过渡到Fragment B.这些片段之间有一个共享元素,其格式为Button和其他View's (见布局)。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:flipper="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mypackage.view.IndicatorViewFlipper
        android:transitionGroup="true"
        android:id="@+id/intro_viewflipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        flipper:indicatorColor="@color/white"
        flipper:indicatorMargin="4dp"
        flipper:indicatorRadius="4dp"
        flipper:indicatorBarMargin="104dp"/>

    <Button
        android:id="@+id/account_create_btn"
        style="?android:attr/borderlessButtonStyle"
        android:textColor="@color/white"
        android:layout_width="match_parent"
        android:layout_height="@dimen/button_standard_height"
        android:layout_above="@+id/txt_already_account"
        android:background="@drawable/button_yellow_selector"
        android:transitionName="create_account"
        android:text="@string/account_create_btn"
        android:textSize="24sp"
        android:textAllCaps="false" />

    <TextView
        android:id="@+id/txt_already_account"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_above="@+id/account_login_btn"
        android:layout_marginTop="24dp"
        android:text="@string/account_welcome_already_account"/>

    <Button
        android:id="@+id/account_login_btn"
        style="?android:attr/borderlessButtonStyle"
        android:layout_width="match_parent"
        android:layout_height="@dimen/button_standard_height"
        android:layout_marginTop="8dp"
        android:layout_alignParentBottom="true"
        android:transitionName="login"
        android:background="@drawable/button_blue_selector"
        android:textColor="@color/white"
        android:textSize="24sp"
        android:textAllCaps="false"
        android:text="@string/account_create_login_btn"/>

</RelativeLayout>

我要做的是让Fragment 中的所有内容除了共享元素,转换(向左滑动)并让所有内容形成{{ 1}} B 除了共享元素从右侧滑入。在此内容转换期间,我希望共享元素保持原始位置,直到内容转换完成,然后让它滑动到Fragment B中的新位置。

这最后一个行为是出错的地方:一旦我在Fragment A中开始退出转换,共享元素就会消失并从右边滑入,内容转换为Fragment B.如果我不添加任何退出/输入转换,则共享元素是正确的。

代码(Fragment A):

Fragment

任何人都可以帮助我获得理想的行为吗?

更新

我做了一个解决方法,几乎​​按照我的想法使用Fragment fragment = MyFragment.newInstance(); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.hide(this); fragmentTransaction.add(R.id.frame_container, fragment, fragment.getClass().getSimpleName()); fragmentTransaction.addSharedElement(sharedElement, sharedElementTag); Transition sharedElementTransaction = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move); sharedElementTransaction.setStartDelay(400); fragment.setSharedElementEnterTransition(sharedElementTransaction); setExitTransition(new Slide(Gravity.LEFT).setDuration(200)); fragment.setEnterTransition(new Slide(Gravity.RIGHT).setDuration(200)); 滑动/淡化它们,并在完成此动画时触发共享元素事务:

animate()

此解决方案的问题在于,我无法滑入被叫Transition sharedElementTransition = TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.move); sharedElementTransition.setStartDelay(400); fragment.setSharedElementEnterTransition(sharedElementTransition); setSharedElementReturnTransition(sharedElementTransition); mLoginBtn.animate() .x(-mLoginBtn.getWidth()) .setDuration(400) .start(); viewFlipper.animate() .x(-viewFlipper.getWidth()) .setDuration(400) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); transaction.commit(); } }) .start(); fragment.setEnterSharedElementCallback(new SharedElementCallback() { @Override public void onSharedElementStart(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) { super.onSharedElementStart(sharedElementNames, sharedElements, sharedElementSnapshots); viewFlipper.animate() .x(0) .setDuration(400) .setListener(null) .start(); mLoginBtn.animate() .x(0) .setDuration(400) .start(); }); 的{​​{1}},因此我现在只是淡入Views

1 个答案:

答案 0 :(得分:0)

如果您只需要在按钮保持静止时为片段设置动画,则可以将按钮移动到活动并为片段设置动画。