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

时间:2014-11-03 15:35:24

标签: android android-5.0-lollipop shared-element-transition activity-transition

我遇到了有关Android 5.0中各种活动之间ImageView转换的奇怪问题/错误。

我正在尝试将缩略图从Fragment AActivity A)转换为Fragment B的标题图片(在Activity B中)。它大部分时间都很好用,但它有时会有点混乱。

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

What a mess... :-)

当然,它应该填满整个区域。两个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());

以下是可观察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);
    }
});

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

<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>

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

尝试将以下代码添加到Fragment B&#39 {s} onCreateView()方法中:

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

此代码存在时问题是否仍然存在?这将确保转换仅在片段完成其布局后开始。

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