Android 4.4 KitKat(API 19)では、ステータスバーを透明にすることができることを知っています。
しかし、例えば、Go Launcher Exなどには透明にするオプションがあり、私にとっては( Android 4. (Jelly bean))、Android 4.0(アイスクリームサンドイッチ)デバイス。
それを使用するのにルートや特別な特権は必要ありませんでした。
Go Launcher Exをダウンロードして、自分で試してみてください。私にとっては、ルートが必要になっても大丈夫でしょう。
しかし、彼らはどうやってそれをしましたか? KitKat以前のデバイスでAndroidのステータスバーを半透明にするにはどうすればよいですか?
---物事を明確にするために---
アクションバー ;については話していない ステータスバー (通知バー)!
これらのサンプル画像を参照してください。
(注意、これは私のStock Galaxy Note 3とAndroid 4.3およびGo Launcher Ex。)
(同じことが私のGalaxy S2とAndroid 4.0でも機能します。 )
透明なステータスバーなし:
With透明ステータスバーが有効:(4.4より前(API 19)デバイスでこれを実現したい)
SamsungおよびSonyデバイスで透明なステータスバーを取得する方法を発見しました
少なくともAndroid 4.0。
まず、ほとんどのデバイスでそれができない理由を説明させてください。
Androidの公式側からは、KitKat(4.4)まで解決策はありません。
ただし、SamsungやSonyなどの一部のデバイスメーカーは、独自のソフトウェアにこのオプションを追加しています。
SamsungはTouchWizと呼ばれる独自のスキンバージョンのAndroidを使用し、Sonyは独自のシステムも使用しています。
これらには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;
}
decorView
のWindow
(アクティビティ内)に適用します。
void ApplyTransparentStatusBar()
{
Window window = getWindow();
if (window != null)
{
View decor = window.getDecorView();
if (decor != null)
decor.setSystemUiVisibility(ResolveTransparentStatusBarFlag());
}
}
このようなフラグを実装している他のデバイスメーカーがあると思います
しかし、私はこの2つしか理解できませんでした(SamsungとSonyのデバイスを所有しているため)
これを使って。 :)
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;
}
}