Android 共享元素转换仅在离开 Activity 时有效,而在进入 Activity 时无效

标签 android animation imageview android-transitions shared-element-transition

我正在使用共享元素转换来为从 Activity A 到 Activity B 的 ImageView 设置动画。 我为此使用以下代码:

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 中 ImageView 的 transitionName。 但我注意到,虽然图像按预期从 B->A 过渡,但从 A->B 的过渡不起作用,两个 Activity 之间只有淡入淡出的动画。

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

注意:A 是一个具有图像回收 View 的 Activity ,每个 Activity 都打开一个细节 Activity (B),图像在两个 Activity 之间转换。

谢谢!

最佳答案

如果您使用任何图像加载库加载图像,那么您需要在图像下载时设置监听器。

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的OnCreate中调用PostponeEnterTransition(),在OnResourceReady中调用startPostponeRequest

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

关于Android 共享元素转换仅在离开 Activity 时有效,而在进入 Activity 时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33383479/

相关文章:

java - 用于隐藏软件键盘的KeyEvent代码?

reactjs - 为什么 React Native Panresponder 中存在 'offset'?

javascript - 滚动动画会破坏页面上的链接

java - 尝试从 ImageView 的 onTouchListener 获取位图像素

android - 简单的 ImageView 缩放

java - 如何使用字符串值以编程方式将图像设置到适配器内的 ImageView?

android - 如何在与父级底部对齐的 CardView 上添加阴影

java - 用 DialogInterface.OnClickListener 区分单个 Dialog

android - 如何创建特定于 flavor 的 Android Lint 基线文件

javascript - 不要在第一次加载时运行 CSS 动画