Skip to content

Eric0liang/ImmersiveSlidingMenu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#完美沉浸式侧滑 ###效果预览 gif

###源码下载地址:https://github.com/Eric0liang/ImmersiveSlidingMenu ###apk下载地址:下载最新版本

##前言 ImmersiveSlidingMenu是在我实际项目中用到的侧滑菜单实现沉浸式,现在开源共享到gitHub上学习交流。 首先要说明的是沉浸式只适合android4.4或以上的系统,也就是API>19(KITKAT)才能看到状态栏沉浸式效果。

##技术详述

  • 侧滑功能
    侧滑功能依赖第三方开源项目SlidingMenu,找到类*SlidingMenu* 315行修改如下:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      mActionbarOverlay = true;
    } else {
      mActionbarOverlay = false;
    }
    
  • 实现沉浸式
    MainActivity初始化左侧菜单时把flag设置成 FLAG_TRANSLUCENT_STATUS,支持透明状态栏

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      Window window = this.getWindow();
      WindowManager.LayoutParams layoutParams = window.getAttributes();
      layoutParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
      window.setAttributes(layoutParams);
    }
    

    然后获取状态栏高度实现主菜单的沉浸式

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      //获取状态栏高度
      int statusbarHeight = getStatusBarHeight();
      LinearLayout top_head = (LinearLayout) this.findViewById(R.id.top_head);
      top_head.setPadding(0, statusbarHeight, 0, 0);
    }
    

    同理左侧菜单实现沉浸式如下:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
      int statusbarHeight = getStatusBarHeight();
      LinearLayout top_head = (LinearLayout) view.findViewById(R.id.main_left_fragment);
      top_head.setPadding(0, statusbarHeight, 0, 0);
    }
    

##开发过程中遇到的问题

截图中设置不透明度的白色线,实现代码如下:

View line = view.findViewById(R.id.view_line);
line.getBackground().mutate().setAlpha(255 * 3 / 10);
//line.getBackground().setAlpha(255 * 3 / 10);

没有调用mutate()引发的问题如下:
line.getBackground()会得到ColorDrawable对象设置3/10的不透明度,然后有些手机的控件背景颜色与line一样的话,就会出现3/10的不透明度。 比如line的背景属性是
android:background="#fff"
,也就是说LinearLayout等其他布局或控件用到*#fff时都会出现不透明度,而不是白色! ####为什么会出现这种情况? 原因是每个 Drawable 类对象类都关联有一个 ConstantState 类对象,这是为了保存 Drawable 类对象的一些恒定不变的数据,如果从同一个 res 中创建的 Drawable 类对象,为了节约内存,它们会共享同一个 ConstantState 类对象*。比如一个 ColorDrawable 类对象,它会关联一个 ColorState 类对象,color 的颜色值是保存在 ColorState 类对象中的。如果修改 ColorDrawable 的颜色值,会修改到 ColorState 的值,会导致和 ColorState 关联的所有的 ColorDrawable 的颜色都改变。在修改 ColorDrawable 的属性的时候,需要先调用 public Drawable mutate() 方法,让 Drawable 复制一个新的 ConstantState 对象关联。

##有问题反馈 在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages