活动之间的图像转换闪烁屏幕
Blinking screen on image transition between activities
我使用棒棒糖中的新共享元素实现了两个活动之间的图像转换。它工作正常,但在转换期间整个屏幕上出现奇怪的白色闪烁,我找不到如何摆脱它。这是一个例子:
这是第二个 activity 的启动方式
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>
感谢您的帮助
您看到的 "white blinking" 是两个活动在过渡期间进入和退出 alpha 动画的结果:当 activity A
开始时 activity B
、activity A
淡出并且 activity B
淡入。
如果要防止状态栏and/or导航栏在过渡过程中淡化(从而减少"blinking"效果),可以看this post。
我遇到了类似的问题。
我按照@Alex 的建议将闪烁的状态栏和导航栏问题排除在过渡之外,但在切换活动时屏幕仍然闪烁。当我删除
"finish();" startActivity() 之后的语句;屏幕停止闪烁。
可能是由于调用 activity 结束。
希望这对某人有所帮助。
我通过更改默认主题的背景颜色解决了这个问题,希望这仍然可以帮助某人节省时间。
<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
在退出 activity 时,调用
getWindow().setExitTransition(null);
在进入 activity 时,调用
getWindow().setEnterTransition(null);
它将防止退出 activity 淡出和进入 activity 淡入,从而消除明显的闪烁效果。
在 helper like
中创建一些方法
public static Transition makeEnterTransition() {
Transition fade = new Fade();
fade.excludeTarget(android.R.id.navigationBarBackground, true);
fade.excludeTarget(android.R.id.statusBarBackground, true);
return fade;
}
在你开始的activity中执行它
getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());
来源
https://github.com/alexjlockwood/custom-lollipop-transitions/
元素淡入淡出,除非您明确指定它们在两个活动中相同。这包括状态和导航栏。
在您的特定情况下,我会将工具栏和这两个视图添加到共享元素列表中:
List<Pair> 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());
在我的情况下,第二个 activity 没有在 activity 主题中使用此标签定义的状态栏。
<item name="android:windowFullscreen">true</item>
由于在纵向模式下隐藏状态栏不是强制性的,我删除了这个标签并在需要时手动 hide/show 状态栏并且闪烁消失了。
我遇到过类似的闪烁问题并尝试了此处提到的许多示例,但对我来说并没有解决问题。对我有用的是将第二个 activity 主题的 window 背景更改为透明。 (@Webdma 使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)
<item name="android:windowBackground">@android:color/transparent</item>
上面的一些有用的答案。
据我了解,这是由 activity 过渡重叠引起的。为了克服这个问题,我在两个活动的 onCreate()
方法中使用了以下值:
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
在您执行转换元素的两个活动的 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);
这将从导航和状态栏中排除动画,因此不再闪烁
将此添加到您的 style.xml。这可以防止屏幕闪烁
<item name="android:windowIsTranslucent">true</item>
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>
在Java中,在父activity中的ActivityCompat.startActivity(activity, intent, options.toBundle());
getWindow().setExitTransition(null);
并在子 activity
的 onCreate 方法中添加以下行
getWindow().setEnterTransition(null);
在 Kotlin 中,在父级中添加以下行 activity
window.setExitTransition = null
并在子 activity
的 onCreate 方法中添加以下行
window.setEnterTransition = null
我使用棒棒糖中的新共享元素实现了两个活动之间的图像转换。它工作正常,但在转换期间整个屏幕上出现奇怪的白色闪烁,我找不到如何摆脱它。这是一个例子:
这是第二个 activity 的启动方式
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>
感谢您的帮助
您看到的 "white blinking" 是两个活动在过渡期间进入和退出 alpha 动画的结果:当 activity A
开始时 activity B
、activity A
淡出并且 activity B
淡入。
如果要防止状态栏and/or导航栏在过渡过程中淡化(从而减少"blinking"效果),可以看this post。
我遇到了类似的问题。 我按照@Alex 的建议将闪烁的状态栏和导航栏问题排除在过渡之外,但在切换活动时屏幕仍然闪烁。当我删除 "finish();" startActivity() 之后的语句;屏幕停止闪烁。 可能是由于调用 activity 结束。 希望这对某人有所帮助。
我通过更改默认主题的背景颜色解决了这个问题,希望这仍然可以帮助某人节省时间。
<item name="android:windowBackground">@color/black</item>
<item name="android:colorBackground">@color/black</item>
在退出 activity 时,调用
getWindow().setExitTransition(null);
在进入 activity 时,调用
getWindow().setEnterTransition(null);
它将防止退出 activity 淡出和进入 activity 淡入,从而消除明显的闪烁效果。
在 helper like
中创建一些方法public static Transition makeEnterTransition() {
Transition fade = new Fade();
fade.excludeTarget(android.R.id.navigationBarBackground, true);
fade.excludeTarget(android.R.id.statusBarBackground, true);
return fade;
}
在你开始的activity中执行它
getWindow().setEnterTransition(TransitionUtils.makeEnterTransition());
来源 https://github.com/alexjlockwood/custom-lollipop-transitions/
元素淡入淡出,除非您明确指定它们在两个活动中相同。这包括状态和导航栏。
在您的特定情况下,我会将工具栏和这两个视图添加到共享元素列表中:
List<Pair> 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());
在我的情况下,第二个 activity 没有在 activity 主题中使用此标签定义的状态栏。
<item name="android:windowFullscreen">true</item>
由于在纵向模式下隐藏状态栏不是强制性的,我删除了这个标签并在需要时手动 hide/show 状态栏并且闪烁消失了。
我遇到过类似的闪烁问题并尝试了此处提到的许多示例,但对我来说并没有解决问题。对我有用的是将第二个 activity 主题的 window 背景更改为透明。 (@Webdma 使用黑色,但在我的情况下,使屏幕闪烁黑色而不是白色)
<item name="android:windowBackground">@android:color/transparent</item>
上面的一些有用的答案。
据我了解,这是由 activity 过渡重叠引起的。为了克服这个问题,我在两个活动的 onCreate()
方法中使用了以下值:
getWindow().setAllowEnterTransitionOverlap(false);
getWindow().setAllowReturnTransitionOverlap(false);
在您执行转换元素的两个活动的 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);
这将从导航和状态栏中排除动画,因此不再闪烁
将此添加到您的 style.xml。这可以防止屏幕闪烁
<item name="android:windowIsTranslucent">true</item>
<!-- edit in your theme -->
<item name="android:windowEnterTransition">@android:transition/no_transition</item>
<item name="android:windowExitTransition">@android:transition/no_transition</item>
在Java中,在父activity中的ActivityCompat.startActivity(activity, intent, options.toBundle());
getWindow().setExitTransition(null);
并在子 activity
的 onCreate 方法中添加以下行getWindow().setEnterTransition(null);
在 Kotlin 中,在父级中添加以下行 activity
window.setExitTransition = null
并在子 activity
的 onCreate 方法中添加以下行window.setEnterTransition = null