共享元素转换没有预期的行为
Shared element transition don't have the expected behaviour
我实现了从 RecyclerView 中的图像到新 Fragment 中的图像之间的共享元素转换。 RecyclerView 托管在 Activity 托管的片段中,目标片段托管在另一个 Activity.
中
当我点击我的图片时,过渡按预期进行,我到达了我的片段。但是当我单击后退按钮时,转换试图将我的图像放在我的 RecyclerView 的第一个位置,而它当前显示的图像不一定是第一个。
根据这种情况,我想因为它是一个图像列表,我在其中设置了一个过渡名称 XML,也许在返回时,因为所有图像都有相同的过渡名称,所以过程很混乱并获取具有给定名称的第一张图像。所以也许我应该动态地给他们每个人一个不同的过渡名称。我还为目标图像设置了相同的名称,并在每次选择新图像时重置它。但它仍然无法正常工作。有人可以帮我吗?
这是我的 onItemClickListener 中的代码:
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// mRootView is the view of the fragment
final ImageView image = (ImageView)
mRootView.findViewById(R.id.rss_element_image);
image.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + position);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
目标片段中的代码如下:
rssImage.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + getArguments().getInt(ARG_ELEMENT_POSITION));
ViewCompat.setTransitionName(rssImage, EXTRA_IMAGE);
这是 themes.xml :
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/theme_primary</item>
<item name="colorPrimaryDark">@color/theme_primary_dark</item>
<item name="android:colorAccent">@color/theme_accent</item>
<!-- enable window content transitions -->
<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>
</style>
编辑:
我发现了我的错误,我从片段 rootView 获取了 ImageView,它从我的 RecyclerView 给我一个随机的 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的视图并且它起作用了!我还将 setTransitionName()
移动到适配器内部。
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// WRONG !
// final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
// Correct
final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
我发现了我的错误,我从片段 rootView 获取了 ImageView,它从我的 RecyclerView 给我一个随机 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的视图并且它起作用了!我还将 setTransitionName() 移到适配器中。
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// WRONG !
// final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
// Correct
final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
我实现了从 RecyclerView 中的图像到新 Fragment 中的图像之间的共享元素转换。 RecyclerView 托管在 Activity 托管的片段中,目标片段托管在另一个 Activity.
中当我点击我的图片时,过渡按预期进行,我到达了我的片段。但是当我单击后退按钮时,转换试图将我的图像放在我的 RecyclerView 的第一个位置,而它当前显示的图像不一定是第一个。
根据这种情况,我想因为它是一个图像列表,我在其中设置了一个过渡名称 XML,也许在返回时,因为所有图像都有相同的过渡名称,所以过程很混乱并获取具有给定名称的第一张图像。所以也许我应该动态地给他们每个人一个不同的过渡名称。我还为目标图像设置了相同的名称,并在每次选择新图像时重置它。但它仍然无法正常工作。有人可以帮我吗?
这是我的 onItemClickListener 中的代码:
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// mRootView is the view of the fragment
final ImageView image = (ImageView)
mRootView.findViewById(R.id.rss_element_image);
image.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + position);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
目标片段中的代码如下:
rssImage.setTransitionName(getString(R.string.transition_name_rss_feed_picture) + getArguments().getInt(ARG_ELEMENT_POSITION));
ViewCompat.setTransitionName(rssImage, EXTRA_IMAGE);
这是 themes.xml :
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/theme_primary</item>
<item name="colorPrimaryDark">@color/theme_primary_dark</item>
<item name="android:colorAccent">@color/theme_accent</item>
<!-- enable window content transitions -->
<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>
</style>
编辑:
我发现了我的错误,我从片段 rootView 获取了 ImageView,它从我的 RecyclerView 给我一个随机的 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的视图并且它起作用了!我还将 setTransitionName()
移动到适配器内部。
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// WRONG !
// final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
// Correct
final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});
我发现了我的错误,我从片段 rootView 获取了 ImageView,它从我的 RecyclerView 给我一个随机 ImageView,这意味着错误的转换名称。所以我使用了 onItemClick 给出的视图并且它起作用了!我还将 setTransitionName() 移到适配器中。
mAdapter.setOnItemClickListener(new RssItemAdapter.OnItemCLickListener(){
@Override
public void onItemClick(View view, int position) {
final RssItem item = mAdapter.getItem(position);
final RssElementIntent intent = new RssElementIntent(getActivity(), item, position);
// WRONG !
// final ImageView image = (ImageView) mRootView.findViewById(R.id.rss_element_image);
// Correct
final ImageView image = (ImageView) view.findViewById(R.id.rss_element_image);
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(), image, RssElementFragment.EXTRA_IMAGE);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
});