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

14

我有以下问题:

我正在尝试从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 中除了共享元素之外的内容进行过渡(向左滑动),并让所有在Fragment B中除了共享元素之外的内容从右侧滑入。在此内容转换期间,我希望共享元素保持在其原始位置,直到内容转换完成,然后让它滑动到Fragment B中的新位置。
这种情况下最后一个行为出现问题:一旦我在Fragment A中开始退出过渡,共享元素就会消失,并随着Fragment B的内容过渡从右侧滑入。如果我不添加任何退出/进入转换,则共享元素的行为是正确的。
代码(在Fragment A中):
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();
   });

这种解决方案的问题在于我无法将被调用的FragmentViews滑入,所以现在只能淡入Views


这可能是一个愚蠢的问题,但你是否研究过场景?你可以给相同的元素ID,然后提供(或删除)所需元素的转换。 - Droidekas
@Droidekas 我已经看了场景,但我不确定如何使用它们来解决我的问题...我已经制作了一个几乎符合我要求的解决方案,我将在我的问题中更新当前解决方案。但仍在寻找使用转换框架完成它的方法。 - Joris
如果您能详细说明为什么需要在两个片段中使用两个不同的按钮实例,那么这可能有助于讨论,如果确实两个按钮将共享单个视觉“视图”给用户。如果用户只看到一个按钮...那么为什么不使用单个Button实例(由Activity或另一个单一用途的片段维护),然后让您的两个内容片段以某种方式获取对它的引用呢? - Mike Repass
我使用了两个Fragment,因为我希望每个Fragment都负责Button的行为,这在两个Fragment中是不同的,并且可以轻松地为这两个屏幕制作布局,除了共享的Button之外,它们完全不同。如果我将Button放置在Activity的布局中,我将很难正确获取布局。但是,如果这是获得共享元素所需的唯一方法,那么我可能会尝试一下。 - Joris
你能提供一个问题的视频吗?这将有助于更好地理解您尝试实现的内容和问题所在。 - Quanturium
@Quanturium 我会尽快找时间来做,可能是在这个周末。 - Joris
1个回答

0
如果您只需要在按钮保持不动的情况下对片段进行动画处理,您可以将按钮移动到活动中并对片段进行动画处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接