最简单的实现沉浸式(透明)状态栏方法_封装成工具类

一.写作目的:加深自己的印象。看了很多篇博客,有多种方法,最后自己总结了下,改动下适合自己的。

然后封了工具类(最后附上完整代码)。

二.实现思路:      1,判断当前版本是不是4.4以上。因为4.4之前是没有这功能的。

2,设置状态栏为透明。透明之后你的标题栏会填充到状态栏。

3,动态的获取状态栏的高度(网友的有的直接固定了,其实不懂分辨率的高度是不一样的,但也无 大碍),然后动态的去设置你的标题栏的高度,也就是加上前面获取的状态栏的高度,不然看起来标题栏会顶上去,像这样。

三.具体实现:

(1),布局没什么可看的,直接看实现的核心吧,我这里抽出来写了个工具类。

//判断当前版本是否大于4.4,因为沉浸式这个功能是在这之后的
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){
//判断的当前界面是activity还是fragment
if (mView!=null){
ll_title= (LinearLayout) mView.findViewById(R.id.ll_title);
}else {
ll_title= (LinearLayout) mActivity.findViewById(R.id.ll_title);
}
if (ll_title!=null){
int statusHeight=getStatusHeight();//获取状态栏高度
if (statusHeight>0){
//透明状态栏
mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明导航栏
// mActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
ViewGroup.LayoutParams params= ll_title.getLayoutParams();
params.height+=statusHeight;//动态的设置标题栏的高度。
//动态的设置标题栏的panddingTop----不设置标题栏的内容还是会往状态栏挤
ll_title.setPadding(0, statusHeight, 0, 0);
ll_title.setLayoutParams(params);
ll_title.setBackgroundResource(R.color.colorAccent);//这里设置状态栏的颜色,与标题栏一致就好
}
}
}

(2)上面调用到获取状态栏高度的方法

//通过反射获取status高度
private int getStatusHeight() {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");//得到dimen这个类,
Object object = c.newInstance();//创建一个实例来代替dimen
Field field = c.getField("status_bar_height");//得到status_bar_height
int x = Integer.parseInt(field.get(object).toString());
return mActivity.getResources().getDimensionPixelSize(x);
}
catch (Exception e){
e.printStackTrace();
}
return 0;
}

(3)上面的是纯色的状态栏,如果要这样呢


这个其实更简单,只需设置透明状态栏就好了,但是要是5.0以上的系统哦

//如果是要背景图填充的话需要5.0以上
public void initStateImager(){
//判断当前版本是否大于5.0,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
View decorView = mActivity.getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
mActivity.getWindow().setStatusBarColor(Color.TRANSPARENT);//其实也就是这个方法需要5.0以上
}
}

(4)到这里基本就没了,

四.注意事项:这个暂时没有,同仁们发现了指正下我啥的啊,谢谢。

(1),在哪里要实现沉浸式就在哪里用这些方法吧,楼主是封成一个工具类,要用直接调用下方法就好,不用复制,如果都要用的在自己的fragment基类和activity基类里调用就可以了,这样其他的activity和fragment继承这两个基类就可以了。

五。效果图


源码传送门

参考

http://blog.csdn.net/wuyinlei/article/details/50564274

http://www.open-open.com/lib/view/open1472112617427.html




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值