1. 程式人生 > >Android沉浸式狀態列的實現

Android沉浸式狀態列的實現

1.沉浸式狀態列的介紹

     話說跟著潮流走,最近多款app都實現了狀態列和標題欄的顏色一致或者漸變,美其名曰"沉浸式狀態列"。這個沉浸式狀態列只有在API大於或等於的android版本手機,以下的版本統統不相容,不要問我為什麼。  現在來看看沉浸式狀態列的神奇效果,在新版的QQ中就使用了這種沉浸式狀態列了

是不是使用者體驗nice呀,反正我是覺得蠻nice的!那麼沒有使用沉浸式狀態列又是怎麼的感覺呢?看看網易郵箱說感覺

尼瑪,導航欄和狀態列都是黑乎乎的兩條槓槓,真心令人捉急 的體驗哦,相形見絀,所以我們得好好學習高大上的沉浸式狀態列咯。

2.沉浸式狀態列的實現

1.系統的方式

①MainActivity

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
        //判斷版本是否支援沉浸式狀態列
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //
透明狀態列 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } }
②activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="90dp" android:fitsSystemWindows="true" android:clipToPadding="true" android:background="@color/colorAccent" android:text="你好,沉浸式狀態列"/> </LinearLayout>
注意:在textview千萬得加上
        android:fitsSystemWindows="true"
android:clipToPadding="true"
③效果圖:


2.首先隱藏佈局,判斷版本支援後顯示佈局

①MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initState();
}

    /**
     * 動態的設定狀態列  實現沉浸式狀態列
*
     */
private void initState() {

        //當系統版本為4.4或者4.4以上時可以使用沉浸式狀態列
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明狀態列
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
//
LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
linear_bar.setVisibility(View.VISIBLE);
//獲取到狀態列的高度
int statusHeight = getStatusBarHeight();
//動態的設定隱藏佈局的高度
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
params.height = statusHeight;
linear_bar.setLayoutParams(params);
}
    }

    /**
     * 通過反射的方式獲取狀態列高度
*
     * @return
*/
private int getStatusBarHeight() {
        try {
            Class<?> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
            int x = Integer.parseInt(field.get(obj).toString());
            return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
            e.printStackTrace();
}
        return 0;
}

}
②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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!--這個是隱藏的佈局,然後通過動態的設定高度達到效果-->
<LinearLayout
android:id="@+id/ll_bar"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:orientation="vertical"
android:background="@color/colorPrimary"
android:visibility="gone">
    </LinearLayout>
    <TextView
android:fitsSystemWindows="true"
android:clipToPadding="true"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/colorAccent"
android:text="你好,沉浸式狀態列"/>
</LinearLayout>
③效果圖:

3.引用第三方SystemBarTint庫實現

①配置build.gradle

compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
②MainActivity:
public class MainActivity extends AppCompatActivity {
    @Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明狀態列
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
// 啟用狀態列
tintManager.setStatusBarTintEnabled(true);
// 啟用導航欄
tintManager.setNavigationBarTintEnabled(true);
//設定系統欄設定顏色
// tintManager.setTintColor(R.color.colorPrimary);
            //給狀態列設定顏色
tintManager.setStatusBarTintResource(R.color.colorAccent);
//Apply the specified drawable or color resource to the system navigation bar.
            //給導航欄設定資源
tintManager.setNavigationBarTintResource(R.color.colorAccent);
}
    }
}
③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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff"
android:orientation="vertical"
>
    <TextView
android:clipToPadding="true"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/colorAccent"
android:text="Hello ,沉浸式狀態列喲"
/>
</LinearLayout>
④效果圖:

補充:三種實現的方法的manifiest中主題改為NoActionBar

android:theme="@style/Theme.AppCompat.Light.NoActionBar">

好了,沉浸式狀態列就是這麼容易,別想多了,就是這麼容易!原始碼地址:http://download.csdn.net/my, 我是張星,歡迎您的關注,後期更精彩!