3

我正在使用共享元素转换来动画从活动 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>

“logo”是A和B中图像视图的transitionName。但我注意到虽然图像按预期从B->A过渡,但从A->B的过渡不起作用,只是有一个淡入淡出两个活动之间的动画。

我做错了什么,如何解决这个问题以使图像也从 A->B 动画?

注意:A 是一个具有图像回收器视图的活动,每个活动都打开一个详细活动(B),图像在两个活动之间转换。

谢谢!

4

2 回答 2

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

调用Detail Activity并调用PostponeEnterTransition().OnCreatestartPostponeRequestOnResourceReady

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;
        }
    });
}
于 2016-05-31T11:27:30.180 回答
0

我测试了所有答案,比如删除动画startPostponedEnterTransition()等等。没有任何效果。最后这条线解决了我的问题。将此添加到您的 style.xml 中。这可以防止屏幕闪烁

<item name="android:windowIsTranslucent">true</item>
于 2021-02-10T09:25:02.393 回答