博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android4.4新的特性,在应用内开启透明状态栏和透明虚拟按钮。
阅读量:5341 次
发布时间:2019-06-15

本文共 3256 字,大约阅读时间需要 10 分钟。

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

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

一种是代码方式:

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

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

和。

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

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

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

1 
6 7
11 12

加入前                                                                 加入后

              

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

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

1 if (android.os.Build.VERSION.SDK_INT > 18) {2             Window window = getWindow();3             window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);4             window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);5             //设置根布局的内边距6             RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.layout);7             relativeLayout.setPadding(0, getActionBarHeight()+getStatusBarHeight(), 0, 0);8         }
1 // 获取手机状态栏高度 2     public int getStatusBarHeight() { 3         Class
c = null; 4 Object obj = null; 5 Field field = null; 6 int x = 0, statusBarHeight = 0; 7 try { 8 c = Class.forName("com.android.internal.R$dimen"); 9 obj = c.newInstance();10 field = c.getField("status_bar_height");11 x = Integer.parseInt(field.get(obj).toString());12 statusBarHeight = getResources().getDimensionPixelSize(x);13 } catch (Exception e1) {14 e1.printStackTrace();15 }16 return statusBarHeight;17 }18 19 // 获取ActionBar的高度20 public int getActionBarHeight() {21 TypedValue tv = new TypedValue();22 int actionBarHeight = 0;23 if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))// 如果资源是存在的、有效的24 {25 actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());26 }27 return actionBarHeight;28 }

设置后的效果

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

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

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

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

1 
2
3
7 8

转载于:https://www.cnblogs.com/zhengxt/p/3536905.html

你可能感兴趣的文章
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
display:none与visible:hidden的区别
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
使用DBCP连接池对连接进行管理
查看>>