透明状态栏 - 安卓4.4之前 (KitKat)

2022-09-01 16:09:55

我知道在Android 4.4 KitKat(API 19)中,可以使状态栏透明。

但是,例如,Go Launcher Ex和其他人可以选择使其透明,并且它也适用于KitKat之前,对我来说(Android 4.3(Jelly Bean))以及我的Android 4.0(冰淇淋三明治)设备。

我不需要root或任何特权来使用它。

下载Go桌面Ex并亲自尝试。对我来说,如果我需要root,那也没关系。

但是他们是怎么做到的呢?如何在 KitKat 之前的设备上使 Android 的状态栏半透明?

---澄清事情---

我不是在谈论行动栏;我的意思是状态栏(通知栏)!


请参阅以下示例图片:

(请注意,这是从我的股票Galaxy Note 3Android 4.3Go Launcher Ex

(同样的事情也适用于我的Galaxy S2Android 4.0

没有透明的状态栏:

Without transparent bar (default)

启用透明状态栏后:(我想在 4.4 之前的 (API 19) 设备上实现此目的)

With transparent status bar (what I want to achieve on pre 4.4 devices in any way


答案 1

我发现如何在至少运行Android 4.0的三星和索尼设备上
获得透明的状态栏。

首先,让我解释为什么在大多数设备上都不可能做到这一点:
从Android的官方方面来看,在KitKat(4.4)之前没有解决方案。
但是三星和索尼等一些设备制造商已经在其专有软件中添加了此选项。

三星使用他们自己的皮肤版本的Android,称为TouchWiz,索尼也在使用自己的系统。
他们有自己的类实现,带有额外的标志,允许在4.4之前的设备上启用透明的状态栏!ViewSYSTEM_UI_

但是,证明这些标志存在并访问它们的唯一方法是使用反射。
这是我的解决方案:


解析视图标志:

int ResolveTransparentStatusBarFlag()
{
    String[] libs = getPackageManager().getSystemSharedLibraryNames();
    String reflect = null;

    if (libs == null)
        return 0;

    for (String lib : libs)
    {
        if (lib.equals("touchwiz"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT_BACKGROUND";
        else if (lib.startsWith("com.sonyericsson.navigationbar"))
            reflect = "SYSTEM_UI_FLAG_TRANSPARENT";
    }

    if (reflect == null)
        return 0;

    try
    {
        Field field = View.class.getField(reflect);
        if (field.getType() == Integer.TYPE)
            return field.getInt(null);
    }
    catch (Exception e)
    {
    }

    return 0;
}

将其应用于您的(在任何活动内):decorViewWindow

void ApplyTransparentStatusBar()
{
    Window window = getWindow();
    if (window != null)
    {
        View decor = window.getDecorView();
        if (decor != null)
            decor.setSystemUiVisibility(ResolveTransparentStatusBarFlag());
    }
}

我认为也许还有其他设备制造商已经实现了这样的标志
,但我只能弄清楚这两个(因为我拥有三星和索尼设备)


答案 2

使用这个。:)

在 super() 之后和设置内容之前。

if (Build.VERSION.SDK_INT >= 19)
{
    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT < 21)
{
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, true);
}

if (Build.VERSION.SDK_INT >= 21)
{
    setWindowFlag(this, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, false);
    getWindow().setStatusBarColor(Color.TRANSPARENT);
}


public static void setWindowFlag(Activity activity, final int bits, boolean state)
{
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();

    if (state)
     {
        winParams.flags |= bits;
    }
     else
     {
        winParams.flags &= ~bits;
    }
}

推荐