GridView项目的共享元素转换毛刺

时间:2015-05-28 13:46:16

标签: android android-listview android-animation android-5.0-lollipop android-transitions

我有以下情况:

1)我有一个带有GridView的活动A,显示图像的缩略图。

2)我有另一个活动B,它只有一个与其父级大小相匹配的PhotoView(link)。

3)当我点击GridView上的任何项目时,小缩略图应根据其当前位置和大小设置动画,并更改为PhotoView中图像的大小。

截图

Activity A with the GridView Activity B with the PhotoView

我的实施

这是我为了许可所做的,

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

<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>

这是我的转换文件。希望根据我的规范这是正确的,

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

这是我获取视图并设置转换名称的地方,

View photo = (View) list.getChildAt(position).findViewById(R.id.fileThumb);
                    photo.setTransitionName("photo" + position);
                    ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(getActivity(), Pair.create(photo, photo.getTransitionName()));

                    Intent intent = new Intent(getActivity(), GalleryActivity.class);
                    intent.putExtra(Config.GALLERY_EXTRA, position);
                    getActivity().startActivity(intent, options.toBundle());

在我的活动B中(完全只有PhotoView),

final PhotoView photoView = new PhotoView(container.getContext());
                    relativeLayout.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
photoView.setTransitionName("position"+pos);

问题

动画有效,但无法接近预期。它根本不光滑和毛病。我究竟做错了什么?我希望这里的任何地方都能抓住我的错误并改进它。

示例 - QuickPic应用程序,Sony Album app。

1 个答案:

答案 0 :(得分:0)

我知道这是一个老问题,你可能已经找到了一个解决方案但是我可以看到它看起来像你使用不同的transitionNames(&#34;位置&#34; + pos vs.&#34; photo&#34 ; + pos)。这有用吗?

我想到的第二件事是将图像加载到图像视图中是耗费资源的,因此您可能需要异步加载它并使用postponeEnterTransition,以便第二个活动可以在启动动画之前正确加载图像

然而,我是Android动画的新手,所以这只是一个猜测和我的2美分。希望我没有完全错,这个答案会对某人有所帮助:)。