正如您在video中所看到的,我正在尝试为新活动的打开制作动画。打开活动时,图像会正确设置动画效果,但返回时却会失败(我正在使用supportFinishAfterTransition()

我已经尝试过在这里或在Google上找到的各种方法,但是没有任何效果,即:

在res / transition下定义转换:

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
    <changeBounds/>
    <changeImageTransform/>
</transitionSet>


然后将其用于主要活动的样式和我要打开的样式:

<!-- enable window content transitions -->
<item name="android:windowActivityTransitions">true</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
    @transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
    @transition/change_image_transform</item>


我也在Java代码中尝试了相同的方法:

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementExitTransition(...);
getWindow().setSharedElementEnterTransition(...);


从我的观察者的角度来看,我正在这样做:

private void openNewActivity() {
        String transitionName = "details";

        Intent intent = new Intent(mContext, ActivityCardDetails.class);

        ViewCompat.setTransitionName(mImageView, transitionName);

        //noinspection unchecked
        ActivityOptionsCompat options =
                ActivityOptionsCompat.makeSceneTransitionAnimation((MainActivity)mContext,
                        mImageView,   // The view which starts the transition
                        transitionName    // The transitionName of the view we’re transitioning to
                );


        ActivityCompat.startActivity((MainActivity) mContext, intent, options.toBundle());
    }


这是开始动画的ImageView:

<ImageView
        android:layout_width="match_parent"
        android:layout_height="180dp"
        android:id="@+id/business_card_image"
        android:adjustViewBounds="true"
        android:scaleType="centerCrop" />


这是第二个ImageView应当对其进行动画处理:

<ImageView
            android:id="@+id/business_card_image"
            android:layout_width="match_parent"
            android:layout_height="180dp"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="@bool/isFitSystemWindows"
            android:transitionName="@string/transition_card_details"
            app:layout_collapseMode="parallax" />


PS:我正在使用Glide加载图像,因为这是用户创建的内容,并且无法控制图像的纵横比。

Glide.with(mContext)
     .load(toLoad)
     .fitCenter()
     .centerCrop()
     .crossFade()
     .into(mImageView);


我已经在这个问题上苦苦挣扎了好几个星期了,但我似乎无法克服它。

为什么它不能为边界重新设置动画?

谢谢!

更新:显然,该错误与图像宽度有关。如果将宽度设置为恒定值(例如200dp),则动画在两种方式下都可以正常运行,但是,如果将图像宽度设置为match_parent,则返回的动画会损坏。

UPDATE2:我可以说这个错误与图片加载库有关(Glide或Picasso都存在此问题)

最佳答案

显然,该问题已在herehere之前进行了描述。问题确实来自图像加载器。

诀窍是将.dontTransform()

ActivityCompat.postponeEnterTransition(this)
ActivityCompat.startPostponedEnterTransition(ActivityCardDetails.this)


仅在正确加载图像后播放动画。

关于android - Android共享元素转换错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39500754/

10-12 00:10
查看更多