我正在使用共享元素转换来为从活动A到活动B的图像视图设置动画。 我正在使用以下代码:
Intent i = new Intent(A.this, B.class);
Pair<View, String> p1 = Pair.create(v2, "logo");
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation((Activity) mContext,p1);
context.startActivity(i, options.toBundle());
我的主题是:
<style name="AnimationTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
</style>
&#34; logo&#34;是A和B中图像视图的transitionName。 但是我注意到,虽然图像从预期的B-> A转变,但是从A-> B的转变不起作用,并且在两个活动之间仅存在淡入淡出的动画。
我做错了什么?我如何解决这个问题,以便从A-&gt; B创建图像动画?
注意:A是具有图像的回收者视图的活动,每个图像都打开一个详细活动(B),图像在两个活动之间转换。
谢谢!
答案 0 :(得分:1)
如果使用任何图像加载库加载图像,则需要在图像下载时设置监听器。
private final RequestListener<Integer, GlideDrawable> listener = new RequestListener<Integer, GlideDrawable>() {
@Override
public boolean onException(Exception e, Integer model, Target<GlideDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GlideDrawable resource, Integer model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
startPostponedEnterTransition();
return false;
}
};
Glide.with(getActivity()).load(list.get(position).getId()).listener(listener).into(imageView);
在详情活动的PostponeEnterTransition()
中致电OnCreate
,然后在startPostponeRequest
中致电OnResourceReady
。
private void startPostponedEnterTransition() {
imageView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
imageView.getViewTreeObserver().removeOnPreDrawListener(this);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
getActivity().startPostponedEnterTransition();
return true;
}
});
}
答案 1 :(得分:0)
我测试了所有答案,例如删除动画或 startPostponedEnterTransition()
等。没有任何效果。最后这条线解决了我的问题。将此添加到您的 style.xml 中。这可以防止屏幕闪烁
<item name="android:windowIsTranslucent">true</item>