9

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

我正在尝试将缩略图从Fragment A(in ) 转换为( in Activity A) 的标题图像。它在大多数情况下运行良好,但有时会稍微有点混乱。Fragment BActivity B

这是它搞砸时的样子:

真是一团糟... :-)

自然,它应该填满整个区域。两个 ImageViews 都设置为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>

有任何想法吗?

4

1 回答 1

4

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

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

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

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

于 2014-11-03T19:11:12.820 回答