1. 程式人生 > >封裝一個BaseActivity並實現沉浸式狀態列

封裝一個BaseActivity並實現沉浸式狀態列

    早就聽聞沉浸式狀態列的大名..但是一直不太明白那究竟是什麼東西,所以就有意去搜索了一下,結果令我大失所望... 就是一個自定義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的程式碼部分:
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();
            }
        });
    }

}
下面為MainActivity的佈局檔案:(在提一嘴 fitsSystemWindows = true 不要忘記寫哦)
<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的程式碼了,雖然我人很好但是無私奉獻默默無聞的事情我可不幹哼~ 如果我整理的程式碼對你有所幫助,記得點個贊謝啦~