一行代码完美实现Android沉浸式效果
来源:互联网 发布:会计软件怎么用 编辑:程序博客网 时间:2024/06/05 19:51
- 什么是沉浸式
- 沉浸式效果展示
- 一行代码完美实现Android沉浸式效果
什么是沉浸式?
沉浸式是APP界面图片延伸到状态栏, 应用本身沉浸于状态栏,所以如果第三方的软件没有为状态栏分配图片,那么自然就是黑色。顶端的状态栏和下面的虚拟按键都隐藏,需要的时候从边缘划出。
沉浸模式。当启用该模式,应用程序的界面将占据整个屏幕,系统自动将隐藏系统的状态栏和导航栏,让应用程序内容可以在最大显示范围呈现,增加大屏体验,而当需要查看通知的时候只需要从顶部向下滑动就能呼出通知栏。
ios系统默认沉浸式的效果一直是很多Android开发者追求的,现在大多主流App也在效仿。之前很早公司项目也有这种需求,失效了效果,不过代码繁琐,需要做大量的判断和设置,使用起来相当麻烦。
突然发现这个开源库,不管你是纯色还是图片完美实现沉浸式效果并且可以根据喜好和需求设置透明度,个人觉得很强大,下面来看看如何一行代码就能完美实现Android沉浸式效果。
不吹不黑,先上图片:
代码分析
当我看了源码后得知,其实也是根据版本判断,只是做了比较好的封装,让我们使用起来更加方便。
还是网上诸多同僚分析的api19和api21分别做了详情的处理;
1.以下是设置通知栏纯色的代码,我们可以清楚看到本文中时舍弃的api19以下的用户,如果想要适配5.0以下手机,需要单独做处理了。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha)); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView(); View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID); if (fakeStatusBarView != null) { if (fakeStatusBarView.getVisibility() == View.GONE) { fakeStatusBarView.setVisibility(View.VISIBLE); } fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); } else { decorView.addView(createStatusBarView(activity, color, statusBarAlpha)); } setRootView(activity); }
使用起来也是相当简单明了,只需要在Activity中onCreate()方法加载布局后调用:StatusBarUtil.setColor(this, getResources().getColor(R.color.colorPrimary));如果App主题和风格是同一种色系,那只需要在BaseActivity中写一个方法,然后集成即可,如果单独界面可以重写方法设置其他风格颜色。
protected void setStatusBar() { StatusBarUtil.setColor(this, getResources().getColor(R.color.colorPrimary)); }
2.以下是设置通知栏图片沉浸式效果,方法参数也很简单,传入一个Activity和View(ImageView)
/** * 为头部是 ImageView 的界面设置状态栏透明 * * @param activity 需要设置的activity * @param statusBarAlpha 状态栏透明度 * @param needOffsetView 需要向下偏移的 View */ public static void setTranslucentForImageView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha, View needOffsetView) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return; } setTransparentForWindow(activity); addTranslucentView(activity, statusBarAlpha); if (needOffsetView != null) { Object haveSetOffset = needOffsetView.getTag(TAG_KEY_HAVE_SET_OFFSET); if (haveSetOffset != null && (Boolean) haveSetOffset) { return; } ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams(); layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity), layoutParams.rightMargin, layoutParams.bottomMargin); needOffsetView.setTag(TAG_KEY_HAVE_SET_OFFSET, true); } }
3.以下是设置DrawerLayout布局沉浸式效果,DrawerLayout是一个比较强大的布局,极其简单的实现侧滑菜单,使侧滑菜单布局实现沉浸式效果。没用使用过得朋友赶紧上手体验以下效果吧。
/** * 为DrawerLayout 布局设置状态栏变色 * * @param activity 需要设置的activity * @param drawerLayout DrawerLayout * @param color 状态栏颜色值 * @param statusBarAlpha 状态栏透明度 */ public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color, @IntRange(from = 0, to = 255) int statusBarAlpha) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { return; } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); activity.getWindow().setStatusBarColor(Color.TRANSPARENT); } else { activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); } // 生成一个状态栏大小的矩形 // 添加 statusBarView 到布局中 ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0); View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID); if (fakeStatusBarView != null) { if (fakeStatusBarView.getVisibility() == View.GONE) { fakeStatusBarView.setVisibility(View.VISIBLE); } fakeStatusBarView.setBackgroundColor(color); } else { contentLayout.addView(createStatusBarView(activity, color), 0); } // 内容布局不是 LinearLayout 时,设置padding top if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) { contentLayout.getChildAt(1) .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(), contentLayout.getPaddingRight(), contentLayout.getPaddingBottom()); } // 设置属性 setDrawerLayoutProperty(drawerLayout, contentLayout); addTranslucentView(activity, statusBarAlpha); }
工作有点忙,写的有点简单粗糙,请各位朋友见谅。
总而言之,使用起来很简单,也方便自己日后使用在此做下记录!
爱编程,爱学习,爱生活。
喜欢学习或者正在学习的朋友可以来QQ群一起交流学习:459756676
附上Demo下载地址:
http://download.csdn.net/download/jaynm/10146060
- 一行代码完美实现Android沉浸式效果
- android Titlebar一行代码实现沉浸式效果
- android:一行代码实现沉浸式布局效果
- android:一行代码实现沉浸式布局效果
- android一行代码实现沉浸式布局效果
- Android 实现沉浸式只需一行代码
- 一行代码实现沉浸式状态栏
- 一行代码实现沉浸式状态栏
- Android沉浸式效果实现
- Android沉浸式状态栏完美实现
- Android 沉浸式状态栏完美实现
- 一行代码使Android状态栏变沉浸式透明化
- android实现沉浸式状态栏效果
- android 沉浸式效果
- Android 两行代码实现沉浸式
- 沉浸式状态栏一行代码调用
- SlideMenu实现沉浸式效果
- Android开源库SlideMenu如何实现沉浸式效果
- Hbase学习笔记(三)
- matplotlib-绘制精美的图表
- Java项目开发规范
- 月薪3000和月薪30000的关注点有什么不同
- 1个掷硬币问题,4个Python解法
- 一行代码完美实现Android沉浸式效果
- 乌镇 · 第四节世界互联网大会 · 马云
- 关于windows编译Line3Dpp
- 搭建玩live555 RTSP server
- springboot实战之注册interceptor
- Trafodion建表之如何定义分区个数
- JavascriptDom编程艺术学习笔记二
- 按回车键登录功能代码
- __attribute__