封装一个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 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 不要忘记写哦)


    

发个截图看下效果:

封装一个BaseActivity并实现沉浸式状态栏_第1张图片


图片很吸引眼球不是么..?好久没有写博客了,今天偷偷的总结一些能够发出来的东西做一些整理和分享,一些不能发出来的东西就涉及到保密的功能和目前比较涉及到RMB的代码了,虽然我人很好但是无私奉献默默无闻的事情我可不干哼~ 如果我整理的代码对你有所帮助,记得点个赞谢啦~

你可能感兴趣的:(安卓基础)