1

更新:

在https://github.com/ulyssesp/SharedElementTransitions有一个重现。

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


我正在尝试使用 Picasso 和缓存中的共享元素转换ImageViewScrollView加载DialogFragment图像。每隔一段时间,当ScrollView滚动时,进入过渡时就会闪烁。

https://drive.google.com/file/d/0B9K_Hjcu9iFOV3lYNVB1UlpsNTQ/view?usp=sharing

最后点击上面的视频文件最能说明我在说什么。请注意,闪烁并非每次都发生,并且必须滚动滚动视图才能发生闪烁。实际项目中发生的事情还有很多,但这是一个重现错误的最小示例项目。

相关代码:

样式.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);

...

图像显示活动:

...

mImageView.setImageBitmap(MainActivity.sCache.get(getIntent().getStringExtra("url") + "\n"));

如果您有任何见解或需要更多信息,请告诉我!

4

1 回答 1

2

这看起来像是活动转换中的错误。即使没有共享元素退出过渡,也没有退出过渡,我们将共享元素移动到 Window 的根覆盖层中。通常这不是问题,但是因为 DialogFragment 创建了一个对话框,它创建了一个新窗口,所以共享元素从对话框的窗口移动到了 Activity 的窗口!您可以看到共享元素临时弹出对话框下方,然后在启动的 Activity 接受它后上升。

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

不过,就目前而言,这行不通。对不起。

于 2015-10-15T18:13:44.783 回答