使用DialogFragment和ScrollView

时间:2015-09-14 17:08:29

标签: android transition shared-element-transition

更新

https://github.com/ulyssesp/SharedElementTransitions有一个复制品。

只有在存在转换ImageView的DialogFragment时才会发生这种情况,有时只会发生。当它确实发生时,如果图像不在DialogFragment的底部但仍然可见,那么您可以看到正确渲染的部分图像。感觉就像是一个竞争条件,DialogFragment在ImageView之后(因此在它之上)呈现。

我正在尝试使用Picasso和缓存来ImageView ScrollViewDialogFragment的共享元素转换来加载图片。当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"));

如果您有任何见解或需要更多信息,请与我们联系!

1 个答案:

答案 0 :(得分:2)

这看起来像是Activity Transitions中的一个错误。即使没有共享元素退出转换也没有退出转换,我们将共享元素移动到Window的根覆盖中。通常这不是问题,但是因为DialogFragment创建了一个对话框,它创建了一个新窗口,共享元素从对话框的窗口移动到Activity的窗口!您可以暂时看到对话框下面的共享元素,然后在启动的Activity获取后将其抬起。

通过将共享元素移动到正确的叠加层而不仅仅是活动窗口的叠加层,能够解决此问题是理想的。这样,如果你从对话框和活动的窗口共享元素,它们都会出现在正确的位置。

但是现在,这不会起作用。遗憾。