Android超简单沉浸式布局

xiaoxiao2021-02-28  21

废话前言 沉浸式真的是个难啃的的东西。不易理解,也是困惑了我好久,现在有时间,来读一读网上大神的帖子学习一下,加上自己的理解。实现起来还是不难的。

只说一种实现起来最简单,最清晰的方法。

三个文件搞定

第一个

res/values/style.xml

<resources <!--全屏显示,无透明状态栏--> <style name="TranslucentTheme" parent="AppTheme"> <item name="android:windowFullscreen">true</item> </style> <!--全屏显示,有透明状态栏--> <style name="statusBar" parent="AppTheme"> </style> </resources>

第二个

res/values-v19/style.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <!--values-v19。v19 开始有 android:windowTranslucentStatus 这个属性,全屏显示,无透明状态栏--> <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> <item name="android:windowFullscreen">true</item> </style> <!--全屏显示,有透明状态栏--> <style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">true</item> <item name="android:windowTranslucentNavigation">true</item> </style> </resources>

第三个

res/values-v21/style.xml

<?xml version="1.0" encoding="utf-8"?> <resources> <!-- values-v21。5.0 以上提供了 setStatusBarColor() 方法设置状态栏颜色。全屏显示,无透明状态栏--> <style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">false</item> <item name="android:windowTranslucentNavigation">true</item> <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色--> <item name="android:statusBarColor">@android:color/transparent</item> <!--全屏显示--> <item name="android:windowFullscreen">true</item> </style> <!--全屏显示,有透明状态栏--> <style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar"> <item name="android:windowTranslucentStatus">false</item> <item name="android:windowTranslucentNavigation">true</item> <!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色--> <item name="android:statusBarColor">@android:color/transparent</item> </style> </resources>

最后把你的需要的name填写到AndroidManifest.xml内Application的theme中就可以了 就这样就实现了

敲黑板: 1.三个文件缺一不可,有了这三个文件,整个屏幕的都是你的地盘 2.分别说一下style的TranslucentTheme和statusBar: TranslucentTheme比statusBar多一句话:<item name="android:windowFullscreen">true</item> 加上这句话,透明的状态栏都不会出现,整个屏幕都是你的地盘

去掉这句话也就是statusBar

在顶部出现了透明状态栏。

小结

理论上到这里就结束了,但是类似QQ的那种纯色的状态栏也就没事实现,也就是给状态栏加上背景色。下面我们来做

进阶

我们需要把状态栏的高度给占住,就可以了,有三个办法

办法一 设置 fitsSystemWindows 属性,这种方法不说了,弊端太多,有兴趣可以去了解一下 办法二 手动添加一个view

<View android:id="@+id/statusBarView" android:background="@color/blue" android:layout_width="match_parent" android:layout_height="wrap_content"> </View>

然后再代码中获取状态栏的高度,赋值给此view。

/** * 利用反射获取状态栏高度 * @return */ public int getStatusBarHeight() { int result = 0; //获取状态栏高度的资源id int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = getResources().getDimensionPixelSize(resourceId); } return result; }

开始赋值

View statusBar = findViewById(R.id.statusBarView); ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams(); layoutParams.height = getStatusBarHeight();

或者不在xml内写View,直接在代码中动态添加

ViewGroup contentView = (ViewGroup) this.findViewById(android.R.id.content); View statusBarView = new View(this); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight()); statusBarView.setBackgroundColor(Color.parseColor("#6495ED"));//设置背景颜色 contentView.addView(statusBarView, lp);

办法三

手动给根视图设置一个 paddingTop,高度为状态栏高度, 然后再在根视图加入一个占位视图,其高度也设置为状态栏高度。

//设置 paddingTop ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content); rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //5.0 以上直接设置状态栏颜色 activity.getWindow().setStatusBarColor(color); } else { //根布局添加占位状态栏 View statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setBackgroundColor(Color.parseColor("#6495ED")); decorView.addView(statusBarView, lp);

到这里基本结束了。

总结

1.无论怎样都要建立三个xml文件 2.在有纯色状态栏的情况下,办法二、三都可以很方便的搞定状态栏。 3.办法三我没有验证,是直接搬过来的

参考大神的:https://www.jianshu.com/p/dc20e98b9a90

转载请注明原文地址: https://www.6miu.com/read-2800244.html

最新回复(0)