文档章节

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
286
0
android4.4以上透明状态栏简单设置

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

指尖上的开源
2014/10/10
0
0
StatusBar、ActionBar tips

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

lightUp
2015/10/18
92
0
android各种效果库

可能是最优雅的切换布局的方法 动态切换布局控件 android 实现画板功能 本例详细分析了一个画板功能的实现过程,并讲述了图像混合和双缓冲技术的基本原理。 有关Activity样式 、状态栏透明、...

掘金官方
2017/12/28
0
0
如何适配Android底部虚拟按键

前言 本文章只做一个记录,一个备忘,也为了更好的帮助他人,文章参考地址:Android适配底部虚拟按键的方法 问题说明 项目进行中需要透明渐变的状态栏,全屏显示,当然透明渐变好弄,方法有很...

no白菜
04/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何通过 J2Cache 实现分布式 session 存储

做 Java Web 开发的人多数都会需要使用到 session (会话),我们使用 session 来保存一些需要在两个不同的请求之间共享数据。一般 Java 的 Web 容器像 Tomcat、Resin、Jetty 等等,它们会在...

红薯
38分钟前
1
0
C++ std::thread

C++11提供了std::thread类来表示一个多线程对象。 1,首先介绍一下std::this_thread命名空间: (1)std::this_thread::get_id():返回当前线程id (2)std::this_thread::yield():用户接口...

yepanl
今天
2
0
Nignx缓存文件与动态文件自动均衡的配置

下面这段nginx的配置脚本的作用是,自动判断是否存在缓存文件,如果有优先输出缓存文件,不经过php,如果没有,则回到php去处理,同时生成缓存文件。 PHP框架是ThinkPHP,最后一个rewrite有关...

swingcoder
今天
1
0
20180920 usermod命令与用户密码管理

命令 usermod usermod 命令的选项和 useradd 差不多。 一个用户可以属于多个组,但是gid只有一个;除了gid,其他的组(groups)叫做扩展组。 usermod -u 1010 username # 更改用户idusermod ...

野雪球
今天
1
0
Java网络编程基础

1. 简单了解网络通信协议TCP/IP网络模型相关名词 应用层(HTTP,FTP,DNS等) 传输层(TCP,UDP) 网络层(IP,ICMP等) 链路层(驱动程序,接口等) 链路层:用于定义物理传输通道,通常是对...

江左煤郎
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部