Android沉浸式狀態列的實現
阿新 • • 發佈:2019-01-10
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) { //②activity_main.xml透明狀態列 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //透明導航欄 getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"注意:在textview千萬得加上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>
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, 我是張星,歡迎您的關注,後期更精彩!