2

我有以下情况:

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

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

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

截屏

带有 GridView 的活动 A 使用 PhotoView 的活动 B

我的实现

这是我为获得许可所做的,

<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 应用程序。

4

1 回答 1

0

我知道这是一个老问题,您可能已经找到了解决方案,但据我所知,您似乎使用了不同的转换名称(“位置”+ pos 与“照片”+ pos)。这真的有效吗?

我想到的第二件事是将图像加载到图像视图中会消耗资源,因此您可能需要异步加载它并使用推迟输入转换,以便第二个活动可以在开始动画之前正确加载图像。

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

于 2017-03-24T17:15:00.230 回答