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

bri*_*ore 26 java android transparent statusbar

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

但是,例如,Go Launcher Ex和其他人可以选择让它变得透明,而且它也适用于预装KitKat,对我来说(Android 4.3(Jelly Bean))以及我的Android 4.0(冰淇淋三明治)设备.

我不需要root或任何特殊权限来使用它.

下载Go Launcher Ex并亲自试用.对我来说,如果我需要root也可以.

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

---澄清事情---

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


看这些示例图片:

(注意,这是从我的股票银河笔记3中获取的Android 4.3Go Launcher Ex.)

(同样适用于我的Galaxy S2Android 4.0.)

没有透明的状态栏:

没有透明条(默认)

随着启用透明状态栏:(我想要实现这个预先4.4(API 19)设备)

使用透明状态栏(我希望以任何方式在4.4之前的设备上实现

bri*_*ore 20

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

首先让我解释为什么在大多数设备上都不可能:
从Android的官方方面来说,直到KitKat(4.4)才有解决方案.
但是像三星和索尼这样的设备制造商已在其专有软件中添加了此选项.

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

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


解析视图标志:

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;
}
Run Code Online (Sandbox Code Playgroud)

将它应用于decorView您的Window(任何活动内部):

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

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

  • 我反编译了具有该功能的三星和索尼的发射器,并且我发现那些旗帜已经存在 (4认同)