文档章节

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

Kobe_Gong_5
 Kobe_Gong_5
发布于 2015/06/20 00:47
字数 808
阅读 37
收藏 1
点赞 0
评论 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
【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一、为什么需要自定义锁屏页 锁屏作为一种黑白屏时代就存在的手机功...

腾讯Bugly
2016/07/18
57
0
如何适配Android底部虚拟按键

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

no白菜
04/13
0
0
Android 手机 开发

转载时请记得标明源地址:http://my.oschina.net/lijindou/blog 1.将系统的状态栏沉浸 getWindow().addFlags(WindowManager.LayoutParams.FLAGTRANSLUCENTSTATUS); //透明导航栏 getWindow(......

紫火晗风
2016/06/02
133
0
Android简单实现系统状态栏设置

github代码直通车 啥也不说了,先上效果图: giphy.gif 设置状态栏透明,通过添加WindowManager.LayoutParams.FLAGTRANSLUCENTSTATUS属性设置。 给状态栏设置颜色: 1.首先调用上面的setTran...

翻滚吧李博
2017/11/23
0
0
苹果 iOS 10 中应当借鉴的十大 Android 特性

据9to5Mac网站报道,即使售价180美元(约合人民币1158元)的第三代MotoG智能手机,尽管比最低端的iOS设备——199美元(约合人民币1281元)的iPodtouch还便宜,其相机也足以与苹果旗舰机型iPhone6...

oschina
2015/12/14
3.3K
24
MeeGo手机UI设计指南

在这个信息高度发达的新移动时代,人们希望他们的终端设备能包含更多的应用,围绕这个对丰富手机应用的追求,一个新的经济正在发展。以设计法则作为我们的核心信条,他驱使我们的每一个讨论都...

红薯
2010/08/21
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高效编写Dockerfile的几条准则

概述 Dockerfile 是专门用来进行自动化构建镜像的编排文件(就像Jenkins 2.0时代的Jenkinsfile是对Jenkins的Job和Stage的编排一样),我们可以通过 docker build 命令来自动化地从 Dockerfi...

小致dad
38分钟前
0
0
SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
9
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
7
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
194
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部