android - Fragments 中的共享元素和内容转换

标签 android android-transitions

我有以下问题:

我正在尝试从 Fragment 过渡A到Fragment B. 这些 fragment 之间有一个共享元素,形式为 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 中开始退出转换共享元素随着 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() 完成我想要的工作在我的 View 中滑动/淡化它们并在完成此动画后触发共享元素事务:

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();
   });

此解决方案的问题是我无法滑入 Views被称为Fragment所以我现在只是淡入Views .

最佳答案

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

关于android - Fragments 中的共享元素和内容转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28696615/

相关文章:

Android 共享元素动画对我不起作用

android - 使 Activity 从上到下动画

android - AChartEngine 在轴上方显示 x 轴标签

java - 限制 iOS 和 Android 的入站流量

java - fragment 转换 : shared elements

android - 如何在 Android 旋转上创建这样的过渡效果

android - 禁用 Android 应用程序中的所有动画

android - 如何在一段时间后更改 imageView 上的图像

Android:通过 content://URI 从第三方应用程序(例如 WhatsApp)获取图像位图

java - 如何在每次值增加时得到通知