经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android Studio 全屏沉浸式透明状态栏效果
来源:cnblogs  作者:_迷途  时间:2020/11/23 11:51:55  对本文有异议

如何实现?

 1.)首先实现全屏

 第一种:继承主题特定主题

 在Android API 19以上可以使用****.TranslucentDecor***有关的主题,自带相应半透明效果,Theme.Holo.NoActionBar.TranslucentDecor和Theme.Holo.Light.NoActionBar.TranslucentDecor两种主题为新增加的,所以要新建values-v19文件夹并创建styles文件添加如下代码

  1. <style name="AppBaseTheme" parent="android:Theme.Holo.Light.NoActionBar.TranslucentDecor">
  2. <!-- Customize your theme here. -->
  3. </style>

第二种:在activity中采用代码的方式

Android 4.4以上可以添加如下代码

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  2. //透明状态栏
  3. window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  4. //透明导航栏
  5. window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  6. }

Android 5.0 以上也可以使用下面的代码实现全屏

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  2. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
  3. | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  4. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  5. | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  6. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  7. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  8. }

2.)解决状态栏占位问题

第一种:主题添加如下设置

  1. <item name="android:fitsSystemWindows">true</item>

第二种:activity layout根目录添加下面代码

  1. android:fitsSystemWindows="true"

第三种:通过Java代码设置

  1. rootview.setFitsSystemWindows(true);

 3.)状态栏导航栏设置背景色

4.4以上的可以采用修改contentView的背景色,或者动态添加一个view到contentView上

  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  2.     //透明状态栏
  3.     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  4.     //透明导航栏
  5.     window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  6.     //设置contentview为fitsSystemWindows
  7.     ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
  8.     View childAt = contentView.getChildAt(0);
  9.     if (childAt != null) {
  10.       childAt.setFitsSystemWindows(true);
  11.     }
  12.     //给statusbar着色
  13.     View view = new View(this);
  14.     view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(this)));
  15.     view.setBackgroundColor(color);
  16.     contentView.addView(view);
  17. }

  

动态获取StatusBarHeight函数如下

  1. /**
  2. * 获取状态栏高度
  3. *
  4. * @param context context
  5. * @return 状态栏高度
  6. */
  7. private static int getStatusBarHeight(Context context) {
  8. // 获得状态栏高度
  9. int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
  10. return context.getResources().getDimensionPixelSize(resourceId);
  11. }

 

动态获取NavigationBarHeight函数如下

  1. /**
  2. * 获取导航栏高度
  3. *
  4. * @param context context
  5. * @return 导航栏高度
  6. */
  7. public static int getNavigationBarHeight(Context context) {
  8. int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
  9. return context.getResources().getDimensionPixelSize(resourceId);
  10. }

4.)贴出整体java代码实现方式

  1. private void initWindows() {
  2. Window window = getWindow();
  3. int color = getResources().getColor(R.color.wechatBgColor);
  4. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  5. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
  6. | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  7. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  8. | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  9. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  10. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  11. //设置状态栏颜色
  12. window.setStatusBarColor(color);
  13. //设置导航栏颜色
  14. window.setNavigationBarColor(getResources().getColor(R.color.footerBgColor));
  15. ViewGroup contentView = ((ViewGroup) findViewById(android.R.id.content));
  16. View childAt = contentView.getChildAt(0);
  17. if (childAt != null) {
  18. childAt.setFitsSystemWindows(true);
  19. }
  20. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  21. //透明状态栏
  22. window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  23. //透明导航栏
  24. window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  25. //设置contentview为fitsSystemWindows
  26. ViewGroup contentView = (ViewGroup) findViewById(android.R.id.content);
  27. View childAt = contentView.getChildAt(0);
  28. if (childAt != null) {
  29. childAt.setFitsSystemWindows(true);
  30. }
  31. //给statusbar着色
  32. View view = new View(this);
  33. view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(this)));
  34. view.setBackgroundColor(color);
  35. contentView.addView(view);
  36. }
  37. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && useStatusBarColor) {//android6.0以后可以对状态栏文字颜色和图标进行修改
  38. getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
  39. }
  40. }

  

转载自:https://www.cnblogs.com/whoislcj/p/6250284.html

 

原文链接:http://www.cnblogs.com/felixwan/p/14012695.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号