我遇到了有关Android 5.0中各种活动之间ImageView
转换的奇怪问题/错误。
我正在尝试将缩略图从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());
以下是可观察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>
有什么想法吗?
答案 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
监听器。