android SlidingMenu实现沉浸式状态栏

转载:https://blog.csdn.net/kkijhuybjju/article/details/54318509

项目中,我们常常可能要使用到侧滑组件SlidingMenu实现侧滑效果,但使用后可发现 :

1,未做任何沉浸式的操作,主界面,侧滑视图和我们的状态栏是相分隔开来的。


2,在设置沉浸式透明的状态栏后,SlidingMenu,主界面没有沉浸到状态栏,状态栏透明显示白色


这种视觉体验效果相对不好,故能否让我们的主界面,侧滑界面和状态栏达到一个相互融合的效果,实现主界面,侧滑视图沉浸融入到状态栏。注沉浸式效果是从android 4.4 开始

为此我参考了:http://blog.csdn.net/zf19921020/article/details/46840383 解决了此问题。修改SlidingMenu的源代码即可实现。


做法:

  1. 修改SlidingMenu.java类attachToActivity()方法的代码,在 switch语句的 case SLIDING_WINDOW:里注释:decor.addView( this);
  2. 添加:
  3. RelativeLayout relativeLayout = new RelativeLayout(activity);
  4. TextView textView = new TextView(activity);
  5. textView.setFitsSystemWindows( true);
  6. relativeLayout.addView(textView);
  7. relativeLayout.addView( this);
  8. decor.addView(relativeLayout);
注意:若为new SlidingMenu对象实现侧滑时要 slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);为SlidingMenu.SLIDING_WINDOW模式



MainActivity.java代码:

  1. public class MainActivity extends Activity {
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. //设置状态栏透明
  7. initTranslucentStatus();
  8. //加载侧滑菜单界面
  9. initSlidingMenu();
  10. }
  11. private void initTranslucentStatus(){
  12. //4.4 全透明状态栏(有的机子是过渡形式的透明)
  13. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
  14. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  15. getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
  16. }
  17. //5.0 全透明实现
  18. if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  19. Window window = getWindow();
  20. window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
  21. window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  22. | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
  23. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
  24. window.setStatusBarColor(Color.TRANSPARENT);// calculateStatusColor(Color.WHITE, (int) alphaValue)
  25. }
  26. }
  27. private void initSlidingMenu() {
  28. SlidingMenu slidingMenu = new SlidingMenu(this);
  29. slidingMenu.setMode(SlidingMenu.LEFT);//左/右侧滑出
  30. slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//全屏触摸监听
  31. slidingMenu.setBehindOffset(150);
  32. //设置滑动时菜单的是否淡入淡出
  33. slidingMenu.setFadeEnabled(false);
  34. //设置淡入淡出的比例
  35. slidingMenu.setFadeDegree(0.5f);
  36. //设置滑动时拖拽效果:即slidingmenu的遮盖滑出效果
  37. slidingMenu.setBehindScrollScale(0);
  38. slidingMenu.setMenu(R.layout.sdm_layout);//侧滑布局
  39. slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);//添加到activity
  40. }
  41. }

xml布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android= "http://schemas.android.com/apk/res/android"
  4. android:orientation= "vertical"
  5. android:layout_width= "match_parent"
  6. android:layout_height= "match_parent">
  7. <FrameLayout
  8. android:layout_width= "match_parent"
  9. android:background= "#cb7aeb"
  10. android:layout_height= "60dp">
  11. <TextView
  12. android:gravity= "center"
  13. android:layout_width= "match_parent"
  14. android:layout_height= "wrap_content" />
  15. </FrameLayout>
  16. <ImageView
  17. android:background= "@mipmap/icon"
  18. android:layout_width= "match_parent"
  19. android:layout_height= "0dp"
  20. android:layout_weight= "1"
  21. />
  22. </LinearLayout>

最后效果:


小结:以上操作简而言之:

1,在onCreate方法里调用 initTranslucentStatus();方法透明化状态栏

2.在SlidingMenu里修改其源代码

***************************************************华丽的分割线************************************************************************

有细心的童鞋可以发现但main_layout.xml布局里包裹一个TextView控件时,textview的文字内容会和状态栏相重。解决办法为TextView设置大小为状态栏高度margin-top值。即可解决文字进入状态栏。可以在代码里设置textview的布局参数。当侧滑改为DrawerLayout侧滑抽屉时也是如此解决textview和状态栏重叠的问题。

java代码:

  1. /**
  2. * Android 获取 屏幕状态栏高度和标题栏高度 避免出现0的情况
  3. */
  4. @Override
  5. public void onWindowFocusChanged(boolean hasFocus) {
  6. super.onWindowFocusChanged(hasFocus);
  7. Rect frame = new Rect();
  8. getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
  9. int statusBarHeight = frame.top; //态栏的高度
  10. Window window = getWindow();
  11. int contentViewTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
  12. int titleBarHeight = contentViewTop - statusBarHeight; // 标题栏高度
  13. //设置TextView的margin-top值
  14. LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) textView.getLayoutParams();
  15. lp.topMargin = statusBarHeight;
  16. textView.setLayoutParams(lp);
  17. }

效果:




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值