Android 图片共享元素切换动画实现详解
本项目实现了图片列表与图片详情页之间的共享元素切换动画,带来流畅的视觉体验。本文档将详细介绍实现原理、关键代码、注意事项及常见问题排查。
一、功能概述
- 在图片列表页点击图片,跳转到大图详情页,图片以共享元素动画平滑过渡。
- 支持多图滑动浏览,返回时图片平滑回到原位置。
- 动画过程无闪烁、无跳变,体验自然。
二、实现原理
Android 5.0+ 支持 Activity 之间的共享元素过渡。核心流程:
- 两个页面的图片控件设置相同的
transitionName
。 - 启动详情页时通过
ActivityOptionsCompat.makeSceneTransitionAnimation
指定共享元素。 - 详情页设置窗口动画(
TransitionSet
),并延迟动画直到图片加载完成。 - 返回时将当前图片位置回传,列表页重新映射共享元素。
三、关键实现步骤
1. 列表页(MainActivity + ImageAdapter)
1.1 图片 transitionName 设置
- 在
onBindViewHolder
中:
holder.shapeableImageView.setTransitionName("image_transition" + position);
1.2 启动详情页并传递共享元素
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
(Activity) context,
holder.shapeableImageView,
"image_transition" + position
);
context.startActivity(intent, options.toBundle());
1.3 处理返回动画的共享元素映射
- 在
MainActivity
设置setExitSharedElementCallback
:
setExitSharedElementCallback(new SharedElementCallback() {
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
if (mReenterPosition != RecyclerView.NO_POSITION) {
RecyclerView.ViewHolder vh = mRecyclerView.findViewHolderForAdapterPosition(mReenterPosition);
if