文档章节

Android4.4新的特性,在应用内开启透明状态栏和透明虚拟按钮。

Kobe_Gong_5
 Kobe_Gong_5
发布于 2015/06/20 00:45
字数 808
阅读 16
收藏 0

除了沉浸模式外,Android 4.4还有新的API,能使应用内的状态栏和虚拟按钮透明。其他更多的Android 4.4 APIs可以看这里

如果要使应用内的状态栏和虚拟按钮变成透明有两种方法。

一种是代码方式:

Window window = getWindow(); 
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);

另外一种是使用两个新的主题风格:

Theme.Holo.NoActionBar.TranslucentDecorTheme.Holo.Light.NoActionBar.TranslucentDecor

但是这种方式只支持Android4.4以上系统,所以为了保持兼容性,我们还是采用代码方式比较好。只需要先判断,如果是4.4以上系统才启用代码。

开启后上下系统栏都透明了。

但是如果应用本身是带有actionbar或者标题栏的话会就会变得比较尴尬,内容会在上面露出来。这个时候需要在布局文件里加入android:fitsSystemWindows="true"。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/layout"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	android:background="#c8c8c8" >
<ListView
	android:id="@+id/listview" 
	android:layout_width="match_parent" 
	android:layout_height="match_parent" /> 
</RelativeLayout>

加入前                                                                 加入后

              

但是这样的话内容就不能从透明的虚拟按钮下穿过,没原来那么好看。我们可以按照以前一样把根布局设置一个高度为系统栏高度和ActionBar高度的内边距就可以。

同时关于获取ActionBar和状态栏的高度,发现用原来的方法有时候会获取的值为0。自己google找了一下,找到两个前辈提供的获取高度方法,获取ActionBar高度获取状态栏高度

if (android.os.Build.VERSION.SDK_INT > 18) {
 	Window window = getWindow(); 
 	window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
 	window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
 	//设置根布局的内边距
 	RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.layout); 
 	relativeLayout.setPadding(0, getActionBarHeight()+getStatusBarHeight(), 0, 0); 
  }
// 获取手机状态栏高度 
public int getStatusBarHeight() {
	Class<?> c = null; 
	Object obj = null; 
	Field field = null; 
	int x = 0, statusBarHeight = 0; 
	try { 
		c = Class.forName("com.android.internal.R$dimen"); 
		obj = c.newInstance();
		field = c.getField("status_bar_height"); 
 		x = Integer.parseInt(field.get(obj).toString()); 
 		statusBarHeight = getResources().getDimensionPixelSize(x); 
 	} catch (Exception e1) { 
 		e1.printStackTrace(); 
  	} 
  	return statusBarHeight; 
   } 
// 获取ActionBar的高度 
public int getActionBarHeight() { 
   TypedValue tv = new TypedValue(); 
   int actionBarHeight = 0; 
   if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))// 如果资源是存在的、有效的 
   { 
   		actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); 
	} 
	return actionBarHeight; 
}

设置后的效果

接下来,因为我自己写的一些应用是暗色的主题的,会导致透明的状态栏和ActionBar颜色不太协调。看到有一些应用是把状态栏的颜色设置成和ActionBar一样,这种解决方法也不错。

具体是怎么实现的也不太清楚,我自己猜测写了一个差不多状态栏。我是直接在根视图加入一个高度为状态栏高度的TextView,背景设置为和ActionBar一样。具体代码如下:

// 创建TextView 
TextView textView = new TextView(this); 
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, getStatusBarHeight()); 
textView.setBackgroundColor(Color.parseColor("#3F9FE0")); 
textView.setLayoutParams(lParams);
// 获得根视图并把TextView加进去。 
ViewGroup view = (ViewGroup) getWindow().getDecorView(); 
view.addView(textView);

在模拟器上看还行,但是在实际的手机当中总感觉ActionBar有点过大,所以我在背景色里加入了一些渐变,在实体手机中就比较好看一点,不会觉得ActionBar太宽了。

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
	<gradient 
		android:startColor="#c8c8c8" 
		android:endColor="#3F9FE0" 
		android:angle="270" 
		android:type="linear"/> 
</shape>

© 著作权归作者所有

共有 人打赏支持
Kobe_Gong_5
粉丝 2
博文 55
码字总数 43587
作品 0
成都
私信 提问
沉浸屏幕状态栏

现在App都讲究“沉浸”样式,不知道这个词从哪里来的,实质就是状态栏透明。我们do平台打开一个新的页面支持三种状态栏方式 显示状态栏: 也就是状态栏的背景色和前景色都是系统提供的缺省颜色...

voxer
2016/04/23
318
0
android沉浸式状态栏封装—教你玩出新花样

项目中我们有时候都要用的透明状态栏(这里也成沉浸式状态栏),今天介绍一个gyf-dev写的一个封装状态栏开源框架 效果图如下: 正文 从Android4.4开始,才可以实现状态栏着色,并且从5.0开始...

终端研发部
2018/12/19
0
0
android4.4以上透明状态栏简单设置

只要在Activity中的onCreate方法中增加如下代码: if (VERSION.SDKINT >= VERSIONCODES.KITKAT) { // 透明状态栏 getWindow().addFlags( WindowManager.LayoutParams.FLAGTRANSLUCENTSTATUS......

指尖上的开源
2014/10/10
0
0
透明状态栏 - StatusBarCompat

透明状态栏只有在 SDK >= 19 (Android 4.4) 才会生效. 透明状态栏 设置状态栏的颜色 这是一个为了兼容处理状态栏的工具类,可以不需要设置不同的文件,最重要的特性就是可以在不重启 Activity...

匿名
2018/12/17
0
0
StatusBar、ActionBar tips

1,StatusBar颜色 1.1 主题设置 在主题(theme)中设置windowTranslucentStatus为true将填充顶部的状态栏区域。(有虚拟按键的设备上)设置windowTranslucentNavigation为true将填充底部导航...

lightUp
2015/10/18
92
0

没有更多内容

加载失败,请刷新页面

加载更多

Navicat使用教程:使用Navicat Premium 12自动执行数据库复制(二)

下载Navicat Premium最新版本 Navicat Premium是一个可连接多种数据库的管理工具,它可以让你以单一程序同时连接到MySQL、Oracle及PostgreSQL数据库,让管理不同类型的数据库更加的方便。 与...

电池盒
22分钟前
1
0
简单聊聊Linux学习经历

学习,是我们一生中都规避不了的一个话题,人的一生中都是在不断的学习,无论是功成名就的人士,还是一无是处的小混混,始终都处在一个不断学习的环境中,只是学习的内容千差万别,有的人是为...

linux-tao
22分钟前
1
0
如何才能从程序员成长为实战型架构师?必掌握这7大实战技能经验

想成为一名架构师,但是架构师对应的技能,我应该掌握哪些啊?以及掌握的程度是什么样的?如何成为一名真正的实战性架构师? 我简要分为以下7点来谈谈,从技能的角度抛砖引玉,希望你对你架构...

mikechen优知
33分钟前
2
0
vue里实现echarts中国地图

echartsDemo.vue <template> <div> <div id="chart_example"></div> </div></template><script> // 首先要 cnpm install echarts import echarts from 'echarts' import ......

Danni3
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部