如何使用Fragments启动共享元素转换?

unc*_*sen 58 android fragment material-design

我正在尝试实现具有"共享元素"的片段之间的转换,如新材料设计规范中所述.我能找到的唯一方法是ActivityOptionsCompat.makeSceneTransitionAnimation,我认为它仅适用于Activity.我一直在寻找相同的功能,但有/片段.

ar3*_*34z 45

我遇到了同样的问题,但是通过从另一个片段添加一个新片段来实现它.以下链接非常有助于开始:https://developer.android.com/training/material/animations.html#Transitions

以下是我的代码.我正在ImageView从一个片段到另一个片段进行动画制作.确保View您想要动画的内容android:transitionName在两个片段中都相同.其他内容并不重要.

作为测试,您可以将其复制到布局xml文件中.确保图像存在.

<ImageView
android:transitionName="MyTransition"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/test_image" />
Run Code Online (Sandbox Code Playgroud)

然后我的文件res/transition夹中有一个名为change_image_transform.xml的文件.

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeImageTransform />
</transitionSet>
Run Code Online (Sandbox Code Playgroud)

现在你可以开始了.假设您有片段A包含图像并想要添加片段B.

在片段A中运行:

@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.product_detail_image_click_area:
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                setSharedElementReturnTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
                setExitTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));

                // Create new fragment to add (Fragment B)
                Fragment fragment = new ImageFragment();
                fragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.change_image_transform));
                fragment.setEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(android.R.transition.explode));

                // Our shared element (in Fragment A)
                mProductImage   = (ImageView) mLayout.findViewById(R.id.product_detail_image);

                // Add Fragment B
                FragmentTransaction ft = getFragmentManager().beginTransaction()
                        .replace(R.id.container, fragment)
                        .addToBackStack("transaction")
                        .addSharedElement(mProductImage, "MyTransition");
                ft.commit();
            }
            else {
                // Code to run on older devices
            }
            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @stoefln查看此链接http://www.androidauthority.com/using-shared-element-transitions-activities-fragments-631996/ (3认同)
  • 这对我有用,除了它总是在第二个片段的屏幕顶部开始动画.因此,如果我在listview的每个元素中(或者在我的案例中为RecyclerView)中有一个视图,并且您点击列表底部附近的一个视图,并且第二个片段中该视图的新位置位于屏幕的底部,则实际上从顶部到底部动画,而不是从视图开始的第一个片段中屏幕上的位置动画.有谁知道这是为什么? (2认同)
  • 我正在为我的适配器中的每个实例分配唯一的ID.我正在附加物品位置.话虽这么说,我解决了我的问题.事实证明,您需要将ChangeTransform包含在TransitionSet中.这告诉系统保存刚刚选择的视图的起始位置,并将其用作新片段中动画的起始位置. (2认同)

小智 21

我发布这个作为答案,因为我是新来的,无法发表评论.

只要源视图和目标视图具有相同(且唯一)的transitionName ,共享元素片段转换可以与ListView一起使用.

如果您使列表视图适配器将唯一的transitionNames设置为您想要的视图(例如某些常量+特定项ID)并且还更改您的详细信息片段以在运行时(onCreateView)将相同的transitionNames设置为目标视图,则转换实际上可以正常工作!

  • 这为我修好了.我现在可以在同一个Activity中将我的共享ImageViews从一个片段动画到另一个片段.现在我的问题是我的ImageViews没有转换到他们的新位置,他们只是出现在他们的新位置,但运行放大动画.我正在使用setSharedElementEnterTransition(new ChangeBounds()); 当我创建我的片段实例时.与ChangeImageTransform()类似的行为 (3认同)
  • 是否有可能获得一段工作代码来测试这个?我现在已经尝试了一段时间,没有任何作用. (3认同)

Jor*_*rdy 11

共享元素可以与Fragments一起使用,但有一些事情要记住:

  1. 不要试图设置sharedElementsTransitiononCreateView您的片段的.您必须在创建Fragment的实例时或在其中定义它们onCreate.

  2. 请注意有关进入/退出转换和sharedElementTransition的可能动画的官方文档.他们不一样.

  3. 试验和错误:)