早就听闻沉浸式状态栏的大名..但是一直不太明白那究竟是什么东西,所以就有意去搜索了一下,结果令我大失所望... 就是一个自定义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();
}
});
}
}
<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的代码了,虽然我人很好但是无私奉献默默无闻的事情我可不干哼~ 如果我整理的代码对你有所帮助,记得点个赞谢啦~