gpt4 book ai didi

android - 层列表 windowBackground 的布局边界是否与膨胀布局不同?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:10 25 4
gpt4 key购买 nike

在我正在开发的应用程序中,我们有一个启动画面,其中包含一个 RelativeLayout 和位于中心的 Logo (以及一些其他内容,例如加载微调器等):

fragment_splash_image.xml:

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:background="@drawable/loading_screen_bg"
... >
<ImageView
android:id="@+id/universal_loading_logo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/logo_large"
... />
... other stuff ...
</RelativeLayout>

为了确保启动画面之前不只是短暂的空白屏幕,我们在 styles.xml 中为该 Activity 设置了一个 SplashTheme。它的 android:windowBackground 只是一个图层列表,标志再次位于中心,希望标志看起来停留在屏幕中间,同时 fragment_splash_image 中的其他东西也出现.

splash_placeholder.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque">
<item android:drawable="@drawable/loading_screen_gradient"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/logo_large"/>
</item>
</layer-list>

请注意,@drawable/logo_large 在每个中都是相同的 Logo ,并且在每个中都位于屏幕中心。预期的行为是它根本不应该出现移动。

无论如何,fragment_splash_image 是在从 FrameLayout 扩展的类中膨胀的,在此方法中:

private void inflateContent() {
final View splashImageFragment = LayoutInflater.from(getContext()).inflate(R.layout.fragment_splash_image, this, true);
final ImageView brandLogo = (ImageView) splashImageFragment.findViewById(R.id.universal_loading_logo);
final int statusBarHeight = ScreenUtils.getStatusBarHeight(getResources());
final int navBarHeight = !ScreenUtils.hasSoftNavBar() ? 0 : ScreenUtils.getNavigationBarHeight(getResources());
brandLogo.setPadding(0, 0, 0, statusBarHeight - navBarHeight);
}

现在,最初,我们只是按原样膨胀了 fragment 。不幸的是,这会导致启动 fragment 中的 Logo 与启动占位符的 Logo 相比向上或向下跳一小段距离,具体取决于测试的设备。在我的 Galaxy S6 手机上,我认为占位符启动画面可能包含状态栏高度,因此我将其添加为 Logo 底部的填充。该设备的问题已解决。然而,在具有软导航栏的 Nexus 7 上, Logo 仍然跳得很高。我得出的结论是,它可能还包括布局边界中的导航栏高度,并写下了您在上面看到的内容:bottom padding = statusBarHeight - navBarHeight,其中 navBarHeight 对于具有硬导航按钮的设备为 0。

这适用于两种设备...然后我在 Google Pixel 上进行了测试。标志跳下来。如果我将底部填充设置为 0,并且将 顶部 填充设置为状态栏高度,则这仅适用于 Pixel。

我被难住了。在这里确定两种布局的高度到底是什么?它们明显不同,我不确定如何确保 Logo 不会在任何设备上从一个屏幕跳到下一个屏幕。提前致谢!

最佳答案

添加<item name="android:windowDrawsSystemBarBackgrounds">false</item>在 API 21+ 上可能允许您为所有设备保留相同的公式。

我遇到了类似的问题,正在考虑走这条路。

关于android - 层列表 windowBackground 的布局边界是否与膨胀布局不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43768558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com