一、任务:
今天我们来玩玩现今app挺漂亮的三种状态栏(名字可能不是这样叫,我随便叫叫,不要纠结这点小细节):
二、实操
long time ago,状态栏都是有黑暗来统治,but经过了漫长的斗争,在4.4(KITKAT)时代光明终于迎来了胜利。状态栏天神不再独裁专制,允许我们来订制自己的专属。
说人话,就是4.4之前我们无法订制状态栏,只有4.4之后才可以。
windowTranslucentStatus:这个属性是指是否允许app的View插入(有点污)到状态栏。
设置这属性有两种方式,可以在styles或者代码设置,个人觉得还是在代码设置比较稳妥点。
Window window = getWindow();
window.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
就是这么的easy,设置之后的效果就是这样滴,可以看到View已经插入(好污的人啊)到状态栏了,so,只要把xml设置background,第三个任务全屏背景就OK啦。
效果是可以,but,你的View已经插入状态栏了,要解决这个问题其实很简单,只要在根布局设置android:fitsSystemWindows=”true”就可以了,这个属性是指是否需要空出状态栏的高度,其实就是相当于paddingTop。修正效果是:
接下来用最简单的办法实现颜色状态栏。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimary" android:fitsSystemWindows="true" android:orientation="vertical">
<!-- 标题栏布局 -->
<RelativeLayout android:id="@+id/title_lay" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize">
</RelativeLayout>
<!-- 内容区布局 -->
<RelativeLayout android:id="@+id/content_lay" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff">
</RelativeLayout>
</LinearLayout>
效果就出来了
是不是感觉so easy呢? 下面我们来介绍终极boss【图片状态栏】,在网上应该也找不到资料。其实也不难,博主相信大家思考一下捣鼓捣鼓也能弄出来的。
分析:
假如UI给你的是一张大图,那么你也可以设置为根布局颜色,然后和上面的颜色状态栏操作相同。but假如UI给的只有头部的小图呢,当然不能通过这种方式设置了,所以这里博主只按小图来设计。
我们需要状态栏和标题栏背景连着,那么他们肯定是在一个layout里面,设置layout的背景即可;我们需要用到状态栏,肯定得插入状态栏;状态栏需要空出来,又得有背景,所以就不能采用fitsSystemWindows来空出,那么我们可为layout设置一个paddingTop或者add一个空的View占据状态栏即可。
<RelativeLayout 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" tools:context="com.fv_mo.appbar.DrawableBarActivity">
<!-- 标题栏layout 必须设置android:gravity="center_vertical" -->
<RelativeLayout android:id="@+id/title_layout" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:gravity="center_vertical">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="24小时热闻" android:textSize="16sp" />
</RelativeLayout>
</RelativeLayout>
/** * 获取状态栏高度 * * @return */
private int getStatusBarHeight() {
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int result = 0;
if (resourceId > 0) {
result = activity.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
// 获取状态栏高度
final int statusHeight = getStatusBarHeight();
final ViewGroup group = (ViewGroup) parentView.getChildAt(0);
final ViewGroup.LayoutParams layoutParams = group.getLayoutParams();
// 4.4以后才进行处理
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
// 重新计算ViewGroup高度
group.post(new Runnable() {
@Override
public void run() {
layoutParams.height = statusHeight + group.getHeight();
}
});
// 设置paddingTop占据状态栏
group.setPadding(0, statusHeight, 0, 0);
}
至此,效果已经达到了预期想要的。
but,bug总是陪伴你左右,我们来看一下5.0的效果图
哟,状态栏咋不管用了呢,4.4和5.0以上设置windowTranslucentStatus效果是不一样的,那可不行啊,老大说必须得给我弄成一样的。从效果图来看titleLayout已经是插入状态栏了,只是状态栏有个半透明的背景盖住了。那简单啊,我们只要把状态栏的背景设为透明不就好吗
window.setStatusBarColor(Color.parseColor("#00000000"));
然并卵,还是一样的效果,查找资料呗,可以百度到windowTranslucentStatus通常是和windowTranslucentNavigation一起使用的,看一下通俗的解释
Android 从 4.4(KitKat) 开始提供了一个视觉上的提升,让最上方的状态栏 (Status Bar) 以及最下方的导航栏 (Navigation Bar) 可以被透明化,并让 APP 的内容可以往上下延伸,使整个画面的可被利用度大幅提升
就是说statusBar 代表头部,navigationBar代表尾部(好lou的理解啊)。
实验总是能告诉人们真理,经过几次调试,我发现只设置navigationBar在5.0以上的手机居然也可以插入状态栏(看来我对navigationBar的理解不是很合理,有知道的朋友告诉麻烦也我一下n(≧▽≦)n),更棒的是只设置navigationBar配合透明的状态栏居然哦了,兴奋ing,这个适配问题就解决咯。贴下完整设置状态栏的代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = appBarUtil.activity.getWindow();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(Color.parseColor("#00000000"));
} else {
// Translucent status bar
window.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
// Translucent navigation bar
window.setFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
能坚持看到这里的朋友给自己点个赞呗(博主语文经常不及格),是不是感觉已经要收工啦,哈哈,NO,这里博主还告诉你们个小秘密,设置了图片状态栏之后假如页面有EditText,是不是发现windowSoftInputMode无效啦,然后上网百度他们就会告诉你设置fitsSystemWindows为true就可以了,but,在这里你不能这样做,设置了fitsSystemWindows就表示要空出状态栏,不能啊,我就是需要把titleLayout插入状态栏实现图片状态栏的啊,是不是很郁闷呢,难道就不能使用图片状态栏了?NO,博主在这里也为你们找到了解决方案,贴一下这位仁兄的博客,特别感谢
http://blog.163.com/ittfxin@126/blog/static/11067486320162210549679/
需要自定义Layout重写fitSystemWindows方法就哦了,这里博主的基础不够,也没能看懂是怎么做到的,只是问题确实解决了。有朋友知道的也麻烦告诉我一下,谢谢!
以上就博主所知道的问题,如有发现其他问题,欢迎留言。