带有共享元素的 Android 片段转换

Posted

技术标签:

【中文标题】带有共享元素的 Android 片段转换【英文标题】:Android fragment transition with shared element 【发布时间】:2015-01-30 16:13:50 【问题描述】:

大家! 我有2个片段。在一个片段中,我在卡片中有一个小图像。在 2d 片段中,我的布局标题中有相同​​的图像。我想使这个图像从一个片段到另一个片段的共享元素转换,就像在这个例子中http://1.bp.blogspot.com/-Vv4SxVSI2DY/VEqQxAf3PWI/AAAAAAAAA7c/mfq7XBrIGgo/s1600/activity_transitions%2B(1).gif

二维片段:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_
android:layout_
android:background="#f2f4f7">
<CustomScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll_view"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:background="#f2f4f7">
    <LinearLayout
        android:id="@+id/content_wrapper"
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:divider="@drawable/vertical_divider"
        android:showDividers="middle">
        <FrameLayout
            android:layout_
            android:layout_>
            <RelativeLayout
                android:id="@+id/header_wrapper"
                android:layout_
                android:layout_>
                <ImageView
                    android:id="@+id/share_image"
                    android:transitionName="imageTransition"
                    android:layout_
                    android:layout_
                    android:src="@drawable/friday"/>

第一个片段:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:orientation="vertical"
android:gravity="center_horizontal"
android:layout_marginTop="56dp"
android:background="#ff1e1e23">
<ImageView
    android:layout_
    android:layout_
    android:layout_marginTop="25dp"
    android:src="@drawable/menuicon1g"/>
<TextView
    android:layout_
    android:layout_
    android:layout_marginTop="25dp"
    android:gravity="center"
    android:textColor="#fff"
    android:textSize="22sp"/>
<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_
    android:layout_
    android:layout_marginTop="25dp"
    card_view:cardCornerRadius="4dp"
    card_view:cardBackgroundColor="#fff"
    card_view:cardElevation="2dp">
    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:gravity="center_horizontal">
        <ImageView
            android:id="@+id/share_image"
            android:transitionName="imageTransition"
            android:layout_
            android:layout_
            android:src="@drawable/friday"/>
        <ImageView
            android:layout_
            android:layout_
            android:layout_marginTop="20dp"
            android:src="@drawable/demo_calendar"/>
        <com.zagum.work.virtualfitness.CustomTextView
            xmlns:com.zagum.work.virtualfitness="http://schemas.android.com/apk/res/com.zagum.work.virtualfitness"
            android:id="@+id/date"
            android:layout_
            android:layout_
            android:textSize="18sp"
            android:layout_marginTop="10dp"
            com.zagum.work.virtualfitness:typeface="fonts/Roboto-Light.ttf"/>
        <TextView
            android:layout_
            android:layout_
            android:layout_marginTop="15dp"
            android:layout_marginBottom="40dp"
            android:gravity="center"
            android:paddingLeft="40dp"
            android:paddingRight="40dp"
            android:textSize="18sp"
            android:textStyle="bold"/>
    </LinearLayout>
</android.support.v7.widget.CardView>

交易:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
                View image = mRootView.findViewById(R.id.share_image);

                CurrentWorkoutFragment secondFragment = CurrentWorkoutFragment.newInstance();
                secondFragment.setSharedElementEnterTransition(TransitionInflater.from(getActivity()).inflateTransition(R.transition.transition_move));

                FragmentTransaction trans = getFragmentManager().beginTransaction();
                trans.replace(R.id.container, secondFragment);
                trans.addToBackStack(null);
                trans.addSharedElement(image, image.getTransitionName());
                trans.commit();
            

transition_move.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
   <changeImageTransform />
   <changeBounds/>
</transitionSet>

但是没有图像动画发生。它出现在左上角调整大小。

【问题讨论】:

那个动画很有趣。我会说,如果您使用片段列表,当您单击片段时,它会启动并且动画会占据全屏。所有额外的视图都已经在片段中,但是它们被隐藏了,因为某些标志发生了变化 【参考方案1】:

查看this的答案。

因为我在 2 个片段之间共享的视图是另一个片段的子视图 在第二个片段中查看(RelativeLayout),您需要添加 ChangeTransform 过渡到您的 TransitionSet。

基本上你需要在你的transition_move.xml中添加一个&lt;changeTransform/&gt;

【讨论】:

以上是关于带有共享元素的 Android 片段转换的主要内容,如果未能解决你的问题,请参考以下文章

片段转换:共享元素

Android:无法使用 Google Maps Fragment 进行共享元素转换

不同活动的片段之间的共享元素转换

不同活动的片段之间的共享元素转换

跨活动的片段之间的共享元素转换不一致

片段之间的共享元素转换