android-活动之间的图像过渡时闪烁屏幕
我使用棒棒糖中的新共享元素在两个活动之间实现了图像过渡。 它正在工作,但是在过渡期间我在整个屏幕上都出现了奇怪的白色闪烁,而且我找不到如何消除它的方法。 这是一个例子:
这是第二项活动的启动方式
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);
和主题文件:
true
true
true
@android:transition/move
@android:transition/move
谢谢你的帮助
11个解决方案
38 votes
在即将结束的活动中,致电getWindow().setEnterTransition(null);
在输入活动中,致电getWindow().setEnterTransition(null);
这将防止退出活动的淡出和进入活动的淡入,从而消除了明显的闪烁效果。
Kevin Lee answered 2020-01-27T11:18:46Z
18 votes
您看到的“白色闪烁”是过渡期间两个活动进行alpha动画输入和输出的结果:当活动A开始活动B,活动A淡出并且活动B淡入时。
如果要防止状态栏和/或导航栏在过渡期间褪色(从而稍微减少“闪烁”效果),可以查看此文章。
Alex Lockwood answered 2020-01-27T11:19:11Z
16 votes
我通过更改默认主题的背景色解决了此问题,希望这仍然可以帮助某人节省时间。
@color/black
@color/black
Webdma answered 2020-01-27T11:19:31Z
9 votes
在助手中做一些方法
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/]
Rzodkiewka answered 2020-01-27T11:20:00Z
3 votes
我遇到了类似的闪烁问题,并尝试了此处提到的许多示例,但对我而言,它并不能解决问题。 对我有用的是将第二个活动主题的窗口背景更改为透明。 (@Webdma使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)
@android:color/transparent
Kasium answered 2020-01-27T11:20:20Z
2 votes
我有一个类似的问题。我按照@Alex的建议将其排除在转换之外,从而解决了状态栏和导航栏闪烁的问题,但是在活动之间进行切换时,屏幕仍然闪烁。 当我删除“完();” startActivity()之后的语句; 屏幕停止闪烁。可能是由于通话活动结束所致。 希望这对某人有帮助。
Neanderthal answered 2020-01-27T11:20:40Z
2 votes
以上是一些有用的答案。据我了解,这是由活动过渡重叠引起的。 为了克服这个问题,我在两种活动的onCreate()方法中都使用了以下值:
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
Randeep answered 2020-01-27T11:21:00Z
1 votes
在我的情况下,第二个活动没有在活动主题中使用此标签定义的状态栏。
true
由于在纵向模式下隐藏状态栏不是强制性的,因此我删除了此标签,并在需要时手动隐藏/显示状态栏,并且闪烁消失了。
JDenais answered 2020-01-27T11:21:25Z
1 votes
将这些代码添加到您在其中执行Transition元素的两个Activity的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);
这将从导航和状态栏中排除动画,因此不再闪烁
Eldhopj answered 2020-01-27T11:21:49Z
0 votes
元素淡入和淡出,除非您明确指定两个活动中的元素相同。 其中包括状态和导航栏。
在您的特定情况下,我将工具栏和这两个视图添加到共享元素列表中:
List viewPairs = new ArrayList<>();
viewPairs.add(Pair.create(findViewById(android.R.id.statusBarBackground), Window.STATUS_BAR_BACKGROUND_TRANSITION_NAME));
viewPairs.add(Pair.create(findViewById(android.R.id.navigationBarBackground), Window.NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME));
// Add your views...
Pair[] array = new Pair[viewPairs.size()];
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), viewPairs.toArray(array)).toBundle();
// ...
ActivityCompat.startActivity(activity, intent, options.toBundle());
gatti answered 2020-01-27T11:22:14Z
0 votes
在您的style.xml中添加它。 这样可以防止屏幕闪烁
true
Rohan buddy answered 2020-01-27T11:22:34Z