我的应用程序平板电脑布局在左侧包含一个网格视图 (RecyclerView),其中包含一个图像网格,右侧是一个详细信息视图,它显示当前所选网格视图图像的较小版本以及描述该图像的附加文本视图。我试图弄清楚如何提供一个共享元素动画过渡,它将任何单击的图像视图(在左侧网格视图片段中)滑动并缩放到其在详细信息视图片段中的匹配位置。我的应用程序只需要一个“进入”转换,因为我不希望每个图像选择都记录在后台堆栈上。
我尝试在我的OnItemClick(View view)
处理程序中使用标准共享元素支持调用,如下所示:
DetailFragment detailFragment = detailFragment.newInstance(mFragmentId);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
movieDetailFragment.setSharedElementEnterTransition(
TransitionInflater.from(this).inflateTransition(
R.transition.change_image_transform));
view.setTransitionName(getString(
R.string.image_transition_name));
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.detail_container,
detailFragment,
DETAIL_FRAGMENT_TAG)
.addSharedElement(view, getString(R.string.image_transition_name))
.commit();
“视图”变量是用户在网格视图中单击的 ImageView。我的细节片段的onCreate()
方法也包含条目
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
mImageView.setTransitionName(
getString(R.string.image_transition_name));
}
我也在使用以下 change_image_transform.xml 转换集:
<transitionSet>
<changeImageTransform/>
<changeBounds/>
</transitionSet>
随着
<item name="android:windowContentTransitions">true</item>
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
所有这些设置都适用于单窗格模式。当用户在网格视图活动中单击图像时,详细信息片段(在新活动中)将替换网格视图,并且动画对于进入和返回场景都非常有效。
然而,在 2 窗格模式下,图像不会从网格视图中的源滑动和缩放到新创建的细节片段中的目标。我相信我遇到的问题是由于源 ImageView 存在于永久可见的网格视图片段中,因此没有包含在动画框架的转换处理中。
除了一个模糊的建议使用简单的自定义动画外,我的搜索没有找到任何明确的答案。我尝试了一个简单的 TranslateAnimation(没有缩放)作为测试,但这有两个问题:它不允许图像穿过网格视图片段的边界,并且它具有实际“移动”图像的不良副作用(离开在执行动画时,我的网格视图中有一个临时空白点)。最终,所需的效果是看到图像滑动并从源缩放到目标,而不会导致原始图像被擦除。
任何建议或意见,将不胜感激。