轉(zhuǎn)載請注明出處:http://www.reibang.com/p/d479e91a8014
本文出自Shawpoo的簡書
我的博客:CSDN博客
前言
關(guān)于系統(tǒng)狀態(tài)欄這個應(yīng)該對于做Android的我們應(yīng)該不陌生了泻云,網(wǎng)上相關(guān)的帖子也是滿大街抱完,那么為什么還要寫此文呢?我覺得是本人親自實踐的結(jié)果对碌,整理了較為簡單輕松的實現(xiàn)方式踊跟,當(dāng)然面向的對象是小白,如果您是大牛請多多指教,就不要嘲笑了...所以此文是讓一些小白更快上手妆够,或者解決一些問題。
關(guān)于狀態(tài)欄的說法
有說法稱這種效果為浸式狀態(tài)欄负蚊,也有說法稱之為透明式狀態(tài)欄神妹。到底是哪種呢?
引用其他文章的一段話:
沉浸式全屏模式隱藏status bar(狀態(tài)欄)使屏幕全屏家妆,讓Activity接收所有的(整個屏幕的)觸摸事件鸵荠。
透明化系統(tǒng)狀態(tài)欄透明化系統(tǒng)狀態(tài)欄,使得布局侵入系統(tǒng)欄的后面伤极。
所以個人更覺得是透明化狀態(tài)欄蛹找,因為狀態(tài)欄還在,下面開始進行實踐操作哨坪,至于具體叫什么庸疾,可以在具體研究,先來實現(xiàn)效果才是首要的当编。
需要了解
首先要了解到届慈,這種透明式狀態(tài)欄只有在4.4版本以上才支持,而4.4和5.0版本以上效果還有區(qū)別忿偷,4.4以下版本默認(rèn)就是黑色金顿,而4.4版本會有一個漸變陰影的效果,5.0及5.0以上版本則為純色鲤桥。
動手實踐
- 1.首先去除默認(rèn)的Toolbar(標(biāo)題欄)
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
2.由于在實際的項目開發(fā)中必然會有一個BaseActivity揍拆,所以將控制狀態(tài)欄的代碼封裝在父類里,這樣每個子類的Activity就擁有了同樣的功能芜壁。
a礁凡、編寫B(tài)aseActivity的布局activity_base.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<View
android:id="@+id/status_bar"
android:layout_width="match_parent"
android:layout_height="0dp"
android:background="@color/colorPrimary"/>
<FrameLayout
android:id="@+id/content_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
</FrameLayout>
</LinearLayout>
由布局可以看出,基類的布局由兩部分組成慧妄,一個是狀態(tài)欄View(通過設(shè)置背景色達到狀態(tài)欄的效果)顷牌,一個是存放Activity內(nèi)容的View。由于各種手機廠商的手機狀態(tài)欄高低不一塞淹,所以需要在代碼中動態(tài)獲取狀態(tài)欄的高低窟蓝。存放Activity內(nèi)容的View也需要在基類中動態(tài)的子類的布局添加到FrameLayout中,這樣就能保證每個頁面上方都有狀態(tài)欄饱普。
- b运挫、編寫B(tài)aseActivity中的代碼:
首先編寫一個ScreenUtil工具類状共,寫一個獲取狀態(tài)欄高度的方法:
/**
* 獲取手機狀態(tài)欄高度
*
* @param context
* @return
*/
public static int getStatusBarHeight(Context context) {
Class<?> c;
Object obj;
Field field;
int x, statusBarHeight = 0;
try {
c = Class.forName("com.android.internal.R$dimen");
obj = c.newInstance();
field = c.getField("status_bar_height");
x = Integer.parseInt(field.get(obj).toString());
statusBarHeight = context.getResources().getDimensionPixelSize(x);
} catch (Exception e1) {
e1.printStackTrace();
}
return statusBarHeight;
}
接下來封裝BaseActivity中的方法:
public abstract class BaseActivity extends AppCompatActivity {
private ViewGroup mContentView;
private View mStatusView, mLayoutView;
private boolean mIsLight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initWindowParameter();
setContentView(R.layout.activity_base);
initContentView();
}
private void initContentView() {
mContentView = findViewByID(R.id.content_view);
mStatusView = findViewByID(R.id.status_bar);
if (mLayoutView == null) {
mLayoutView = getLayoutInflater().inflate(getLayoutId(), null);
}
mContentView.removeAllViews();
mContentView.addView(mLayoutView);
setStatusBarColor(R.color.colorPrimary);
}
public abstract int getLayoutId();
public <T extends View> T findViewByID(int id) {
return (T) super.findViewById(id);
}
/**
* 隱藏Toolbar
*/
public void hideStatusBar() {
mStatusView.setVisibility(View.GONE);
}
/**
* 設(shè)置是否為亮色主題
*
* @param isLight
*/
public void setLightStatusBar(boolean isLight) {
this.mIsLight = isLight;
}
/**
* 設(shè)置狀態(tài)欄顏色
*
* @param color
*/
public void setStatusBarColor(int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(LinearLayout
.LayoutParams.MATCH_PARENT, ScreenUtil.getStatusBarHeight(this));
mStatusView.setBackgroundResource(color);
mStatusView.setLayoutParams(lParams);
mStatusView.setVisibility(View.VISIBLE);
}
}
/**
* 設(shè)置狀態(tài)欄等與Window相關(guān)的參數(shù)
*/
protected void initWindowParameter() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//5.0+
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
if (mIsLight) { //如果StatusBar為亮色主題的話幽告,則文字顏色為深色
option = option | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
}
decorView.setSystemUiVisibility(option);
getWindow().setStatusBarColor(Color.TRANSPARENT);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {//4.4~5.0
WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
localLayoutParams.flags);
}
}
}
- 3比庄、子類繼承BaseActivity
public class MainActivity extends BaseActivity {
private Toolbar mToolbar;
@Override
public void onCreate(Bundle savedInstanceState) {
// setLightStatusBar(true); //需要在父類的onCreate方法前執(zhí)行
super.onCreate(savedInstanceState);
mToolbar = findViewByID(R.id.toolbar);
mToolbar.setTitle(getString(R.string.app_name));
mToolbar.setVisibility(View.GONE);
hideStatusBar();
}
@Override
public int getLayoutId() {
return R.layout.activity_main;
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.shawpoo.stutasbar.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="@color/colorPrimary">
</android.support.v7.widget.Toolbar>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@mipmap/image"/>
</LinearLayout>
- 4类腮、運行上述代碼可以看出:
由于在開發(fā)過程中難免遇到圖片為淺色的情況巷懈,可以使用View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,也就是上面代碼中的setLightStatusBar()方法寻歧。但是只在5.0或5.0以上版本支持曹阔。下面是兩種顏色的對比圖:
如果上面的效果不能滿足的話玷犹,可以給狀態(tài)欄設(shè)置一個半透明的陰影儡循,這樣會更好些舶吗。如下圖所示:
以上純屬本人自己實踐,如有疑問請留言择膝,還請各位大牛指點誓琼。
詳細(xì)可以點擊下載Demo