我想使用共享元素创建活动转换,例如解释here。
我希望左侧的列表项转换为右侧突出显示的框。
嗯,这很有效,但不幸的是退出过渡根本不起作用。从第二次活动回来后,我得到了这个:
CardView只是停留在原处并且不会在任何地方缩放或转换。过了一会儿它消失了。
我认为退出转换将是向后转换,但这似乎并非如此。如何让CardView转换回左边的ListItem?
这是我目前的代码:
在第一个活动的OnItemClickListener中
Intent intent = new Intent(context, DisplayEpisodeActivity.class);
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,clickedRow.findViewById(R.id.background), "background");
startActivity(intent, options.toBundle());
我的主题:
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="NewApi">
<style name="BaseTheme" parent="android:Theme.Material.Light.DarkActionBar">
<item name="android:colorPrimary">#D32F2F</item>
<item name="android:textColorPrimary">#616161</item>
<item name="android:colorPrimaryDark">#B71C1C</item>
<item name="android:colorAccent">#757575</item>
<item name="android:colorControlHighlight">#EF9A9A</item>
<item name="android:windowContentTransitions">true</item>
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style>
</resources>
change_image_transform.xml:
<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeTransform/>
<changeBounds/>
</transitionSet>
我已将transitionName
设置为右侧布局的android.support.v7.widget.CardView
和左侧的RelativeLayout
。
答案 0 :(得分:6)
活动和片段共享转换都很难调试。默认情况下,动画很快,有时眼睛只能看到“有什么不对劲”,但要弄清楚什么/为什么可能是非平凡的。
在调试从A到B的共享转换时,我通常会发现对覆盖onMapSharedElements
方法非常有用,因此您可以轻松找出A中哪些共享元素与B中的元素相关联。这样的内容(内部) B的onCreate()
方法:
setEnterSharedElementCallback(new SharedElementCallback() {
@Override
public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
Log.i(Constants.TAG, "EnterSharedElement.onMapSharedElements:" + sharedElements.size());
//manual override of non-working shared elements goes here
super.onMapSharedElements(names, sharedElements);
}
@Override
public void onRejectSharedElements(List<View> rejectedSharedElements) {
//Some element was rejected? Aha!!
Log.i(Constants.TAG, "EnterSharedElement.onMapSharedElements:" + rejectedSharedElements.size());
super.onRejectSharedElements(rejectedSharedElements);
}
@Override
public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements, List<View> sharedElementSnapshots) {
//AFTER the shared transition
super.onSharedElementEnd(sharedElementNames, sharedElements, sharedElementSnapshots);
}
});
}catch (Exception uie){
Log.e(Constants.TAG,"UIE:"+uie.getMessage());
}
通过这种方式,可以更容易地找出未映射的元素(可能它们尚未创建)并解决共享转换问题(即:毛刺,伪像)