对于共享元素转换,我正在关注this github项目。它有2个屏幕 - 一个带有Recyclerview,有多个卡片和一个卡片。第二个细节屏幕。正如所料,它展示了imageview& amp;的共享元素转换。从recyclerview项目到详细屏幕的文本视图&背压上的反向过渡。
但是,如果用户在详情屏幕上更改方向,&然后按回按钮然后反向过渡动画不起作用。在2:49到2:57之间查看this视频的帧,即使在方向改变之后,它似乎也是可能的。对此有何想法?
编辑:
请检查this video以便更好地理解。
答案 0 :(得分:8)
最后,我可以通过将单独的主题应用于详细屏幕覆盖以下属性值来修复此问题,但不确定为什么此参数会更改动画行为。
<item name="android:windowIsTranslucent">true</item>
答案 1 :(得分:2)
你必须设置:
requestWindowFeature(Window.FEATURE_CONTENT_TRANSITIONS);
requestWindowFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
在调用和被调用的活动中(本例中为MainActivity + NextActivity)。
我假设您通过调用:
打开NextActivityActivityOptions options = ActivityOptions.
makeSceneTransitionAnimation(this, new Pair<View, String>(viewToAnimate, "animationName"));
Intent intent = new Intent(MainActivity.this, NextActivity.class);
startActivity(intent, options.toBundle());
在NextActivity中你必须添加:
animatingView.setTransitionName("animationName");
如果您这样做,点按后退按钮即可进行转换。
但如果您转动设备并按后退按钮则无法使用。
为了解决这个问题,我在第一个活动中添加了这个(本例中为MainActivity):
animatingView.setTransitionName("animationName");
系统现在知道屏幕旋转后要动画的内容。
答案 2 :(得分:1)
我遇到了同样的问题,这是我修复它的方法。
单击RecyclerView项目时,我会传递当前位置:
@Override
public void onItemClick(View sharedView, String transitionName, int position) {
viewPosition = position;
Intent intent = new Intent(this, TransitionActivity.class);
intent.putExtra("transition", transitionName);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(this, sharedView, transitionName);
ActivityCompat.startActivity(this, intent, options.toBundle());
}
我将它保存在onSaveInstanceState中以保持跨配置更改:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(VIEW_POSITION, viewPosition);
}
然后,在onCreate方法中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround for orientation change issue
if (savedInstanceState != null) {
viewPosition = savedInstanceState.getInt(VIEW_POSITION);
}
setExitSharedElementCallback(new SharedElementCallback() {
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
super.onMapSharedElements(names, sharedElements);
if (sharedElements.isEmpty()) {
View view = recyclerView.getLayoutManager().findViewByPosition(viewPosition);
if (view != null) {
sharedElements.put(names.get(0), view);
}
}
}
});
}
问题原因:方向更改后,sharedElements地图为空(我不知道原因)。
答案 3 :(得分:0)
如果你进入“开发者选项”并启用“不要保持活动”,我想你会发现问题也会发生。换句话说,问题不在于您正在旋转设备......但更常见的是,第一个活动在后台被销毁。
查看您的示例代码,看起来您正在使用适配器做一些奇怪的事情(即,从后台线程每隔50ms为回收器查看新的网格项)?我可以看到为什么这可能会给你带来一些问题...例如,如果调用活动被销毁并且需要在用户单击后退按钮并且返回转换开始后立即重新创建,该怎么办?如果共享元素返回转换开始并且第一个活动中尚不存在所需的共享元素(例如,因为适配器尚未添加它),则转换将无法正常工作。
我认为这应该是足以让您开始解决问题的信息。