在Android 5.0中转换ImageView时出现奇怪的问题

Mic*_*Bak 9 android android-5.0-lollipop activity-transition shared-element-transition

我遇到了一个关于ImageViewAndroid 5.0中的活动之间转换的奇怪问题/错误.

我试图从缩略图转换Fragment A(中Activity A)到的头部图像Fragment B(在Activity B).它大部分时间都运行良好,但它有时会轻微混乱.

这是一张它弄乱时的样子:

真是一团糟... :-)

当然,它应该填满整个区域.两个ImageView都设置为ScaleType.CENTER_CROP,所以我无法想象这是问题.

令人好奇的是,该问题在滚动时立即自行修复Activity B(所有内容都包含在子类中ScrollView,ImageView在滚动时更改填充).

启动代码Activity B非常简单:

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
    activity, thumbImageView, "cover"); // "cover" is the shared element name for both ImageViews
ActivityCompat.startActivity(activity, intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)

这是可观察的ScrollView侦听器的代码:

scrollview.setOnScrollChangedListener(new OnScrollChangedListener() {
    @Override
    public void onScrollChanged(ScrollView who, int l, int t, int oldl, int oldt) {
        // Such parallax, much wow
        headerImageView.setPadding(0, (int) (t / 1.5), 0, 0);
    }
});
Run Code Online (Sandbox Code Playgroud)

此外,这是我的主题风格的一部分:

<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ale*_*ood 4

尝试将以下代码添加到FragmentB 的onCreateView()方法中:

getActivity().postponeEnterTransition(); 
scrollView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
        scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
        getActivity().startPostponedEnterTransition();
        return true;
    }
});
Run Code Online (Sandbox Code Playgroud)

当此代码存在时,问题仍然出现吗?这将确保过渡仅在片段完成布局后开始。

您甚至可能需要startPostponedEnterTransition()比这晚调用...例如,如果您在第二个活动中加载高分辨率图像,请尝试startPostponedEnterTransition在加载图像后调用(即将onPreDraw监听器设置ImageView在窗口的装饰视图上而不是) )。

  • 如果我错了,@GeorgeMount 可以纠正我,但我相信处理加载缓慢的高分辨率图像的一种方法是利用框架在过渡开始之前获取共享元素的“快照”。如果您调用“Activity#setEnterSharedElementCallback()”,然后重写“onSharedElementStart()”,第三个参数将为您提供一个“快照视图”列表,如果高分辨率图像尚未出现,则可以在转换期间将其用作占位符已加载。我自己从未测试过这个,只是想让你知道它的存在。 (2认同)