【发布时间】:2017-07-05 14:28:24
【问题描述】:
我已经解决这个问题好几个星期了,但我仍然无法解决这个问题。
所以,我有一个 CardView,它包含一个带有 ImageView 的 LinearLayout。
如果没有该半径,共享元素过渡可以无缝运行。但是,当我将半径 (app:cardCornerRadius="25dp") 添加到该 CardView 时,共享元素转换看起来很丑,因为它首先删除半径,然后开始动画。
第一种方法:ObjectAnimator
我创建 ObjectAnimator 来为卡片上的半径值设置动画,动画结束后开始过渡。
ObjectAnimator animator = ObjectAnimator
.ofFloat(view, "radius", AppUtil.dpAsPixel(this, 25), 0);
animator.setDuration(150);
animator.addListener( // start new Activity with Transition );
animator.start();
这可行,但看起来不太好,因为过渡会在开始过渡之前等待动画完成。我需要的是在过渡到新 Activity 时半径正在设置动画(类似于 TransitionSet 中的 ORDERING_TOGETHER)。
第二种方法 - ChangeImageTransform
我已经阅读了 StackOverflow post 以使用像 ChangeImageTransform 和 ChangeBounds 这样的转换类。
我确实按照建议定义了我的应用程序主题(my_transition 包含 ChangeImageTransform 转换集)
<item name="android:windowSharedElementEnterTransition">@transition/my_transition</item>
<item name="android:windowSharedElementExitTransition">@transition/my_transition</item>
但它不起作用..
第三种方法 - 天真
我最后一次尝试是强制目标 ImageView 的半径也为 25dp。因为也许我的 CardView 变成了方形,因为目标 ImageView 是方形的,但是你可以猜到,它不起作用。
第四种方法 - 不使用 CardView
如您所见,我正在使用企鹅图像并使用 CardView 来制作半径。我可以使用图像转换使图像变圆,但我仍然认为这不是创建共享元素转换的正确方法..
这是我的问题,有没有办法在不先移除半径的情况下使用 CardView 半径进行共享元素转换?
【问题讨论】:
-
你能显示过渡文件吗?您指定要转换的视图是什么?
-
@azizbekian 给你gist.github.com/aldoKelvianto/ebc337d6766506171c2c285e97278805,xml 和共享元素转换代码没什么特别的
-
这是你的 xml。但是您在哪里指定要转换的视图 iD?
-
下一个活动你怎么吃午饭?
-
@azizbekian 这里是java代码gist.github.com/aldoKelvianto/fe7d845331e3b1085d563cd9aac7ff9c
标签: android android-animation android-cardview android-transitions shared-element-transition