封裝一個BaseActivity並實現沉浸式狀態列
阿新 • • 發佈:2018-12-31
早就聽聞沉浸式狀態列的大名..但是一直不太明白那究竟是什麼東西,所以就有意去搜索了一下,結果令我大失所望... 就是一個自定義view能夠設定透明 或其他顏色來替換狀態列或者說成是遮蓋住狀態列比較合適.. 當然我看網上介紹了一些比較高大上的沉浸式狀態列,能夠實現顏色漸變的效果,確實能夠對得起“沉浸式”這一說道.. 今天我這裡會總結透明狀態列,和不同顏色的狀態列,雖然這種東西爛大街了,但是自己能力有限,那種高大上的漸變效果,還是等自己能力比較厲害的時候再去研究吧,畢竟這兩種就已經可以滿足專案中大多數的需求了,漸變效果也不是特別的必要.
沉浸式狀態列需要注意的一點是需要在佈局檔案最外側層使用:
android:fitsSystemWindows="true"
這個東西是適應系統視窗大小的,再就是為了簡便一些不用每次都寫一大堆程式碼,所以我在BastActivity中封裝的方法,當activity繼承自BastActivity時,就能直接引用設定狀態列的方法,來起到簡化程式碼的作用,話不多說直接上程式碼:
import android.app.Activity; import android.os.Build; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.LinearLayout; public abstract class BaseActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(setLayout()); initView(); initData(); } // 設定佈局 abstract int setLayout(); // 初始化元件 protected abstract void initView(); // 初始化資料 protected abstract void initData(); public <T extends View> T bindView(int id){ return (T)findViewById(id); } public static void setColor(Activity activity,int color){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ // 設定狀態列透明 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 生成一個狀態列大小的矩形 View StatusView = createStatusView(activity,color); // 新增statusView到佈局中 ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); decorView.addView(StatusView); // 設定根佈局的引數 ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)) .getChildAt(0); rootView.setFitsSystemWindows(true); rootView.setClipToPadding(true); } } /** * 生成一個和狀態列大小相同的矩形條 * @param activity 需要設定的activity * @param color 狀態列的顏色值 * @return 狀態列矩形條 */ private static View createStatusView(Activity activity, int color) { // 獲得狀態列的高度 int resourceId = activity.getResources() .getIdentifier("status_bar_height","dimen","android"); int statusBarHeight = activity.getResources() .getDimensionPixelSize(resourceId); // 繪製一個和狀態列一樣高度的矩形 View statusView = new View(activity); LinearLayout.LayoutParams params = new LinearLayout .LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,statusBarHeight); statusView.setLayoutParams(params); statusView.setBackgroundColor(color); return statusView; } /***********************我是分割線***************************/ /** * 使狀態列透明 * 適用於圖片作為背景的介面,此時需要圖片填充到狀態列 * @param activity 需要設定的activity */ public static void setTranslucent(Activity activity){ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){ // 設定狀態列透明 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // 設定根佈局的引數 ViewGroup rootView = (ViewGroup)((ViewGroup)activity .findViewById(android.R.id.content)).getChildAt(0); rootView.setFitsSystemWindows(true); rootView.setClipToPadding(true); } } }
以上是我封裝的BastActivity,此外的兩個方法setColor 和 setTranslucent方法可以在BastActivity中直接使用,但是也可以在被繼承自BastActivity中呼叫,隨你們喜歡~ 下面是MainActivity 繼承自BastActivity的程式碼部分:
下面為MainActivity的佈局檔案:(在提一嘴 fitsSystemWindows = true 不要忘記寫哦)import android.graphics.Color; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends BaseActivity { private Button btn; @Override int setLayout() { return R.layout.activity_main; } @Override protected void initView() { // setColor(MainActivity.this,Color.BLACK); // 改變狀態列的顏色 setTranslucent(MainActivity.this); // 改變狀態列變成透明 btn = bindView(R.id.btn); } @Override protected void initData() { btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "按鈕被觸發", Toast.LENGTH_SHORT).show(); } }); } }
<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"
tools:context="sq.materialdesign.MainActivity"
android:fitsSystemWindows="true"
android:background="@mipmap/a_1">
<Button
android:id="@+id/btn"
android:text="@string/xx"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
發個截圖看下效果:
圖片很吸引眼球不是麼..?好久沒有寫部落格了,今天偷偷的總結一些能夠發出來的東西做一些整理和分享,一些不能發出來的東西就涉及到保密的功能和目前比較涉及到RMB的程式碼了,雖然我人很好但是無私奉獻默默無聞的事情我可不幹哼~ 如果我整理的程式碼對你有所幫助,記得點個贊謝啦~