我使用来自棒棒糖的新共享元素在两个活动之间实现了图像转换。它正在工作,但在转换过程中我在整个屏幕上发出奇怪的白色闪烁,我无法找到如何摆脱它。这是一个例子:
以下是第二项活动的启动方式
public static void launch(
@NonNull Activity activity, @NonNull View transitionView, Game game) {
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(
activity, transitionView, game.gameFullId);
Intent intent = new Intent(activity, ListImportationLoginActivity.class);
intent.putExtra(INTENT_EXTRA_GAME, retailer);
ActivityCompat.startActivity(activity, intent, options.toBundle());
}
然后在onCreate:
ViewCompat.setTransitionName(mLogoView, mGame.gameFullId);
主题文件:
<resources>
<style name="Theme.MyApp.NoActionBar" parent="Theme.MyApp.NoActionBar.Base">
<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">true</item>
<item name="android:windowAllowReturnTransitionOverlap">true</item>
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item>
<item name="android:windowSharedElementExitTransition">@android:transition/move</item>
</style>
</resources>
感谢您的帮助
答案 0 :(得分:35)
在退出活动中,请致电
getWindow().setExitTransition(null);
在进入活动时,请致电
getWindow().setEnterTransition(null);
它可以防止退出活动的淡出和进入活动的淡入,从而消除明显的眨眼效果。
答案 1 :(得分:18)
您看到的“白色闪烁”是转换过程中两个动画进出动画的结果:当活动A
开始活动B
时,活动A
消失out和活动B
淡入。
如果要防止状态栏和/或导航栏在转换过程中褪色(从而减少“闪烁”效果),可以查看this post。
答案 2 :(得分:15)
我通过更改默认主题的背景颜色来解决这个问题,希望这仍然可以帮助有人节省时间。
<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
答案 3 :(得分:9)
在帮助器中制作一些方法,如
public static Transition makeEnterTransition() {
Transition fade = new Fade();
fade.excludeTarget(android.R.id.navigationBarBackground, true);
fade.excludeTarget(android.R.id.statusBarBackground, true);
return fade;
}
在你正在开始的活动中执行它
getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());
来源 https://github.com/alexjlockwood/custom-lollipop-transitions/
答案 4 :(得分:3)
我有类似的闪烁问题并尝试了很多这里提到的例子,但对我来说它并没有解决问题。对我有用的是将第二个活动主题的窗口背景更改为透明。 (@Webdma使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)
<item name="android:windowBackground">@android:color/transparent</item>
答案 5 :(得分:2)
我有类似的问题。 我按照@Alex的建议将过滤器排除在状态栏和导航栏问题后解决了问题,但在切换活动时屏幕仍然闪烁。当我删除了 “完();” startActivity()之后的语句;屏幕停止闪烁。 可能是因为通话活动结束了。 希望这有助于某人。
答案 6 :(得分:2)
上面的一些有用的答案。
据我了解,这是由活动过渡重叠引起的。为了解决这个问题,我在两个活动的getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
方法中使用了以下值:
{{1}}
答案 7 :(得分:2)
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>
答案 8 :(得分:1)
在我的情况下,第二个活动没有使用此标记在活动主题中定义的状态栏。
<item name="android:windowFullscreen">true</item>
由于不必在纵向模式下隐藏状态栏,因此我删除了此标记并在需要时手动隐藏/显示状态栏并且闪烁消失。
答案 9 :(得分:1)
在您执行过渡元素的两个活动的 onCreate 中添加这些代码
Fade fade = new Fade();
View decor = getWindow().getDecorView();
fade.excludeTarget(decor.findViewById(R.id.action_bar_container),true);
fade.excludeTarget(android.R.id.statusBarBackground,true);
fade.excludeTarget(android.R.id.navigationBarBackground,true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
这将从导航和状态栏中排除动画,因此不再闪烁
答案 10 :(得分:0)
在您的style.xml中添加它。这样可以防止屏幕闪烁
<item name="android:windowIsTranslucent">true</item>
答案 11 :(得分:0)
在 Java 中,在 ActivityCompat.startActivity(activity, intent, options.toBundle()) 之后的父活动中添加以下行;
getWindow().setExitTransition(null);
并在子活动的 onCreate 方法中添加以下行
getWindow().setEnterTransition(null);
在 Kotlin 中,在父活动中添加以下行
window.setExitTransition = null
并在子活动的 onCreate 方法中添加以下行
window.setEnterTransition = null