【问题标题】:ImageView Shared Element Transition between Fragment and ActivityFragment 和 Activity 之间的 ImageView 共享元素转换
【发布时间】:2017-01-12 10:48:28
【问题描述】:

我正在查看器中显示电影图像。每当用户选择图像时,它将被动画化(调整大小)并绘制在另一个活动上。问题是我无法正确实现动画。

这是我的 viewpager 的代码(在 MoviesPager.java 片段内):

View v = inflater.inflate(R.layout.pager_fragment, container, false);
poster = (ImageView) v.findViewById(R.id.selectedMoviePoster);
final View sharedView=poster;
final String transitionName=y.getOriginalTitle();
ActivityCompat.startActivity(getActivity(),sendMovie, ActivityOptions.makeSceneTransitionAnimation(getActivity(),sharedView,transitionName).toBundle());

这里的“y”是要显示的电影对象。

这是实现viewpager的MainActivity.java的代码:

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);//=<item name="android:windowActivityTransitions">true</item>*/
getWindow().setExitTransition(new Fade());//=<item name="android:windowExitTransition">@transition/fade</item>
getWindow().setSharedElementExitTransition(new ChangeImageTransform());//same as above

这是显示电影详情的Movie.java代码

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().setEnterTransition(new Fade());
getWindow().setSharedElementEnterTransition(new ChangeImageTransform());

过渡名称设置为:

1) 在 activity_main.xml

    <android.support.v4.view.ViewPager
    android:id="@+id/currentMoviesViewPager"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:transitionName="viewPagerTransition"/>

2) 在 activity_movie.xml

    <android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="300dp"
    android:fitsSystemWindows="true"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/collapsing_toolbar"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorAccent"
        app:expandedTitleMarginEnd="64dp"
        app:expandedTitleMarginStart="48dp"
        app:layout_scrollFlags="scroll">

        <ImageView
            android:id="@+id/selectedMoviePoster"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="1"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:layout_collapseMode="pin"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

        <View
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:background="@android:color/white"
            app:layout_collapseMode="parallax"
            app:layout_collapseParallaxMultiplier="1"/>

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

3) 在 pager_fragment.xml 这是 viewpager 片段的 xml

    <android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    card_view:cardElevation="40dp"
    card_view:cardCornerRadius="4dp"
    android:clipChildren="false"
    android:clipToPadding="false">


    <ImageView
        android:id="@+id/selectedMoviePoster"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <ProgressBar
        android:id="@+id/loadPosterProgress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

</android.support.v7.widget.CardView>

我在这两个活动中都使用Universal Image Loader 来下载和显示图像。

如果可能的话,我可以在加载之前存储图像,这样我就不必每次都下载。将图像大小调整为 imageview 也无法正常工作。

我为这两个活动使用了两个不同的主题,这里是代码。

4) styles.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowBackground">@android:color/darker_gray</item>
    <item name="android:windowContentTransitions">true</item>
</style>

<style name="Theme.AppCompat.Light.FullScreen">
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
    <item name="android:windowBackground">@android:color/darker_gray</item>
    <item name="android:windowContentTransitions">true</item>
</style>

【问题讨论】:

标签: android android-viewpager retrofit2 universal-image-loader shared-element-transition


【解决方案1】:

你可以为这个过渡做的是:

                    View sharedView = holder.event_pic;
                    String transitionName = mContext.getString(R.string.event_image);
                    Intent intent_event_description = new Intent(mContext, EventDescription.class);
                    if (Build.VERSION.SDK_INT >= 21) {
                        ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(activity, sharedView, transitionName);
                        mContext.startActivity(intent_event_description, transitionActivityOptions.toBundle());
                    }

确保为两张图片提供相同的 ID。

在您的风格主题中:

    <item name="android:windowContentTransitions">true</item>

请为两张图片提供相同的过渡名称:

           <ImageView
            android:id="@+id/selectedMoviePoster"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_collapseMode="parallax"
            android:transitionName="selectedMoviePoster"
            app:layout_collapseParallaxMultiplier="1"/>

            <ImageView
             android:id="@+id/selectedMoviePoster"
             android:layout_width="match_parent"
             android:transitionName="selectedMoviePoster"
             android:layout_height="match_parent"/>

【讨论】:

  • 感谢您的快速回复。它有效,但我仍然有问题。首先它显示完整的白屏,但​​现在它至少在下一个屏幕上显示活动和图像的动画,但仍然无法获得该海报/图像的动画。这就是正在发生的事情:dropbox.com/s/2sfy50p15lbpsdh/20160905-120104.mp4?dl=0。也许是因为正在下载另一个图像?有什么办法可以解决这个问题?
  • 在 ActivityCompat.startActivity(getActivity(),sendMovie, ActivityOptions.makeSceneTransitionAnimation(getActivity(),sharedView,transitionName).toBundle()); // 你传递的过渡名称是什么?
  • final String transitionName=y.getOriginalTitle(); in MoviesPager.java
  • @RushiMThakker 查看我的编辑,尝试为两个图像提供相同的过渡名称,并让我知道它是否有效。
  • 首先,非常感谢您的回复。其次,我按照您说的尝试了,但结果是海报没有显示在详细信息屏幕上,而是显示白屏。你想让我在代码端保留什么作为过渡名称:selectedMoviePoster?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 2015-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多