Android 状态栏虚拟导航键透明效果的实现方法
程序员文章站
2023-11-27 09:00:34
状态栏和虚拟导航键 4.4上半透明,5.0以上可以全透明
先上效果
4.4 半透明效果
5.0及以上 全透明效果
上代码
mainactivity代码...
状态栏和虚拟导航键 4.4上半透明,5.0以上可以全透明
先上效果
4.4 半透明效果
5.0及以上 全透明效果
上代码
mainactivity代码
public class mainactivity extends appcompatactivity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // 隐藏标题栏 supportrequestwindowfeature(window.feature_no_title); view root = layoutinflater.from(this).inflate(r.layout.activity_main, null); // 或者 在界面的根层加入 android:fitssystemwindows=”true” 这个属性,这样就可以让内容界面从 状态栏 下方开始。 viewcompat.setfitssystemwindows(root, true); setcontentview(root); if (build.version.sdk_int >= build.version_codes.lollipop) { // android 5.0 以上 全透明 window window = getwindow(); window.clearflags(windowmanager.layoutparams.flag_translucent_status | windowmanager.layoutparams.flag_translucent_navigation); window.getdecorview().setsystemuivisibility(view.system_ui_flag_layout_fullscreen | view.system_ui_flag_layout_hide_navigation | view.system_ui_flag_layout_stable); window.addflags(windowmanager.layoutparams.flag_draws_system_bar_backgrounds); // 状态栏(以上几行代码必须,参考setstatusbarcolor|setnavigationbarcolor方法源码) window.setstatusbarcolor(color.transparent); // 虚拟导航键 window.setnavigationbarcolor(color.transparent); } else if (build.version.sdk_int >= build.version_codes.kitkat) { // android 4.4 以上 半透明 window window = getwindow(); // 状态栏 window.addflags(windowmanager.layoutparams.flag_translucent_status); // 虚拟导航键 window.addflags(windowmanager.layoutparams.flag_translucent_navigation); } } }
activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorprimary" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="hello world!" /> </relativelayout>
5.0以上的几行代码不是很懂,从源码看是需要添加的,以后找到这几个方法是做什么用的再回来注明
setstatusbarcolor源码
/** * sets the color of the status bar to {@code color}. * * for this to take effect, * the window must be drawing the system bar backgrounds with * {@link android.view.windowmanager.layoutparams#flag_draws_system_bar_backgrounds} and * {@link android.view.windowmanager.layoutparams#flag_translucent_status} must not be set. * * if {@code color} is not opaque, consider setting * {@link android.view.view#system_ui_flag_layout_stable} and * {@link android.view.view#system_ui_flag_layout_fullscreen}. * <p> * the transitionname for the view background will be "android:status:background". * </p> */ public abstract void setstatusbarcolor(@colorint int color);
setnavigationbarcolor源码方法
/** * sets the color of the navigation bar to {@param color}. * * for this to take effect, * the window must be drawing the system bar backgrounds with * {@link android.view.windowmanager.layoutparams#flag_draws_system_bar_backgrounds} and * {@link android.view.windowmanager.layoutparams#flag_translucent_navigation} must not be set. * * if {@param color} is not opaque, consider setting * {@link android.view.view#system_ui_flag_layout_stable} and * {@link android.view.view#system_ui_flag_layout_hide_navigation}. * <p> * the transitionname for the view background will be "android:navigation:background". * </p> */ public abstract void setnavigationbarcolor(@colorint int color);
fitssystemwindows属性需设置为true,否则布局会和状态栏重叠
如图:
两种方式:
方式一(xml文件根布局添加属性):
android:fitssystemwindows=”true”
方式二(代码中设置):
viewcompat.setfitssystemwindows(rootview, true);
其实还有第三种方式解决此问题,获取状态栏高度,在最上设置一个等高的view
/** * 获取状态栏高度 * @return */ public int getstatusbarheight() { int statusbarheight = 0; int resourceid = getresources().getidentifier("status_bar_height", "dimen", "android"); if (resourceid > 0) { statusbarheight = getresources().getdimensionpixelsize(resourceid); } return statusbarheight; }
源码地址:https://github.com/stormsuncc/mycompatstatusbar
以上所述是小编给大家介绍的android 状态栏虚拟导航键透明效果的实现方法,希望对大家有所帮助