Ale*_*scu 1 android android-animation android-transitions shared-element-transition
正如您在此视频中看到的那样,我正在尝试为新活动的开放制作动画.在打开活动时,图像会正常动画,但在返回时会失败(我正在使用supportFinishAfterTransition())
我尝试了各种各样的方法,我在这里或谷歌上找到了,但没有任何效果,即:
在res/transition下定义转换:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds/>
<changeImageTransform/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
然后在主要活动的样式和我要打开的样式中使用它:
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
我也在我的java代码中尝试过相同的东西:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setSharedElementExitTransition(...);
getWindow().setSharedElementEnterTransition(...);
Run Code Online (Sandbox Code Playgroud)
从我的观点持有人那里开始我的新活动:
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());
}
Run Code Online (Sandbox Code Playgroud)
这是启动动画的ImageView:
<ImageView
android:layout_width="match_parent"
android:layout_height="180dp"
android:id="@+id/business_card_image"
android:adjustViewBounds="true"
android:scaleType="centerCrop" />
Run Code Online (Sandbox Code Playgroud)
这是第二个应该为其设置动画的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" />
Run Code Online (Sandbox Code Playgroud)
PS:我使用Glide加载图像,因为这是用户创建的内容,我无法控制图像的宽高比.
Glide.with(mContext)
.load(toLoad)
.fitCenter()
.centerCrop()
.crossFade()
.into(mImageView);
Run Code Online (Sandbox Code Playgroud)
几个星期以来,我一直在努力解决这个问题,而我似乎无法克服它.
为什么它不能激活其边界?
谢谢!
更新:显然,错误与图像宽度有关.如果我将宽度设置为常量(比如200dp),则动画在两种方式下运行都很好,但如果我将图像宽度设置match_parent为返回动画则会中断.
UPDATE2:我几乎可以说这个bug与图像加载lib有关(Glide或Picasso都有这个问题)
显然这个问题已经在这里和这里被描述过了.问题确实来自图像加载器.
诀窍是使用.dontTransform()与
ActivityCompat.postponeEnterTransition(this)
ActivityCompat.startPostponedEnterTransition(ActivityCardDetails.this)
Run Code Online (Sandbox Code Playgroud)
仅在正确加载图像时播放动画.
| 归档时间: |
|
| 查看次数: |
2825 次 |
| 最近记录: |