使用 DialogFragment 和 ScrollView 时共享元素过渡闪烁
Shared element transition flicker when using DialogFragment and ScrollView
更新:
https://github.com/ulyssesp/SharedElementTransitions 有一个重现。
这只发生在有一个 DialogFragment 保存转换 ImageView 时,而且它只是偶尔发生。当它确实发生时,如果图像离开 DialogFragment 的底部但仍然可见,那么您可以看到图像的一部分被正确渲染。感觉这是一种竞争条件,DialogFragment 在 ImageView 之后(因此在其之上)呈现。
我正在尝试使用 Picasso 和缓存从 ScrollView
到 DialogFragment
中的 ImageView
共享元素转换来加载图像。每隔一段时间滚动 ScrollView
时,进入过渡时会出现闪烁。
https://drive.google.com/file/d/0B9K_Hjcu9iFOV3lYNVB1UlpsNTQ/view?usp=sharing
最后一次点击上面的视频文件最能说明我在说什么。请注意,闪烁不会每次都发生,必须滚动滚动视图才能发生闪烁。实际项目中发生了很多事情,但这是重现错误的最小示例项目。
相关代码:
styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowSharedElementReenterTransition">@null</item>
<item name="android:windowSharedElementExitTransition">@null</item>
</style>
ImageFragment::onCreateView:
...
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityOptions activityOptions =
ActivityOptions.makeSceneTransitionAnimation(getActivity(), v, "image");
Intent i = new Intent(getActivity(), ImageDisplayActivity.class);
i.putExtra("url", "http://i.imgur.com/DvpvklR.png");
getActivity().startActivity(i, activityOptions.toBundle());
}
});
new Picasso.Builder(getActivity())
.memoryCache(MainActivity.sCache)
.build()
.load("http://i.imgur.com/DvpvklR.png")
.into(mImageView);
...
ImageDisplayActivity:
...
mImageView.setImageBitmap(MainActivity.sCache.get(getIntent().getStringExtra("url") + "\n"));
如果您有任何见解或需要更多信息,请告诉我!
这看起来像是 Activity 转换中的错误。即使没有共享元素退出过渡也没有退出过渡,我们将共享元素移动到 Window 的根覆盖层中。通常这不是问题,但是因为 DialogFragment 创建了一个对话框,它创建了一个新的 window,共享元素从对话框的 window 移动到 Activity 的 window !您可以看到共享元素暂时在对话框下方弹出,然后在启动 Activity 接受它后上升到上方。
最好能够通过将共享元素移动到正确的叠加层来解决此问题,而不仅仅是 Activity Window 的叠加层。这样,如果您共享对话框中的元素和 activity 的 windows,它们都会出现在正确的位置。
不过,目前这还行不通。对不起。
更新:
https://github.com/ulyssesp/SharedElementTransitions 有一个重现。
这只发生在有一个 DialogFragment 保存转换 ImageView 时,而且它只是偶尔发生。当它确实发生时,如果图像离开 DialogFragment 的底部但仍然可见,那么您可以看到图像的一部分被正确渲染。感觉这是一种竞争条件,DialogFragment 在 ImageView 之后(因此在其之上)呈现。
我正在尝试使用 Picasso 和缓存从 ScrollView
到 DialogFragment
中的 ImageView
共享元素转换来加载图像。每隔一段时间滚动 ScrollView
时,进入过渡时会出现闪烁。
https://drive.google.com/file/d/0B9K_Hjcu9iFOV3lYNVB1UlpsNTQ/view?usp=sharing
最后一次点击上面的视频文件最能说明我在说什么。请注意,闪烁不会每次都发生,必须滚动滚动视图才能发生闪烁。实际项目中发生了很多事情,但这是重现错误的最小示例项目。
相关代码:
styles.xml:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowSharedElementReenterTransition">@null</item>
<item name="android:windowSharedElementExitTransition">@null</item>
</style>
ImageFragment::onCreateView:
...
mImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityOptions activityOptions =
ActivityOptions.makeSceneTransitionAnimation(getActivity(), v, "image");
Intent i = new Intent(getActivity(), ImageDisplayActivity.class);
i.putExtra("url", "http://i.imgur.com/DvpvklR.png");
getActivity().startActivity(i, activityOptions.toBundle());
}
});
new Picasso.Builder(getActivity())
.memoryCache(MainActivity.sCache)
.build()
.load("http://i.imgur.com/DvpvklR.png")
.into(mImageView);
...
ImageDisplayActivity:
...
mImageView.setImageBitmap(MainActivity.sCache.get(getIntent().getStringExtra("url") + "\n"));
如果您有任何见解或需要更多信息,请告诉我!
这看起来像是 Activity 转换中的错误。即使没有共享元素退出过渡也没有退出过渡,我们将共享元素移动到 Window 的根覆盖层中。通常这不是问题,但是因为 DialogFragment 创建了一个对话框,它创建了一个新的 window,共享元素从对话框的 window 移动到 Activity 的 window !您可以看到共享元素暂时在对话框下方弹出,然后在启动 Activity 接受它后上升到上方。
最好能够通过将共享元素移动到正确的叠加层来解决此问题,而不仅仅是 Activity Window 的叠加层。这样,如果您共享对话框中的元素和 activity 的 windows,它们都会出现在正确的位置。
不过,目前这还行不通。对不起。