[奇技淫巧] Android 4.4 5.0 6.0 6.0+ 另一种思路的沉浸式状态栏
来源:互联网 发布:网店美工学生实训报告 编辑:程序博客网 时间:2024/04/29 10:38
以前在大号写过一篇同名文章 ,有一天登陆CSDN,网站居然要绑定手机号,于是尝试绑定手机号时发现手机号已被另一个ID绑定,没法解锁。看了下文章有很多地方需要修改,不得不另立新号重写文章。
引用:
[奇技淫巧] Android 4.4 5.0 6.0 另一种思路的沉浸式状态栏
自己的文章,可惜要绑定手机,基本是告别这个ID了
http://blog.csdn.net/HQS515/article/details/73608633
思路:网上大多数教程讲怎么样设置状态栏背景颜色,各版本适配下来比较繁琐。仔细一想自定义标题栏的做法,为啥不直接去掉状态栏,然后自己写一个状态栏上去呢,颜色就变得可控?
写一个枚举判断版本
private enum SystemOS { API00("Android 1.1以上"), API19("Android 4.4以上"), API21("Android 5.0以上"), API23("Android 6.0以上"); String desc; SystemOS(String desc) { this.desc = desc; } }
对应判断版本的方法
static { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { //0.0 <= system < 4.4 systemOS = SystemOS.API00; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //4.4 <= system < 5.0 systemOS = SystemOS.API19; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { //5.0 <= system < 6.0 systemOS = SystemOS.API21; } else { //6.0 <= system systemOS = SystemOS.API23; } }
关键点:
去除顶部状态栏
Window window = activity.getWindow(); window.setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
view.setSystemUiVisibility(View.INVISIBLE //隐藏状态栏半透明背景,同时Activity会伸展全屏显示 view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); //Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮 View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR // 设置状态栏文字为暗色 6.0以上 View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 设置状态栏文字为浅色
计算statusBar的方法:
private int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; }
完整的方法:
public class StatusBarUtil { private boolean isTransparent; private View view = null; private static SystemOS systemOS = SystemOS.API00; private Activity activity; static { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { //0.0 <= system < 4.4 systemOS = SystemOS.API00; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //4.4 <= system < 5.0 systemOS = SystemOS.API19; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { //5.0 <= system < 6.0 systemOS = SystemOS.API21; } else { //6.0 <= system systemOS = SystemOS.API23; } } public StatusBarUtil getImageLayout(Activity activity, int resId) { return getNewLayout(activity, resId, 0, true); } public StatusBarUtil getBaseLayout(Activity activity, int resId, int statusBarColor) { return getNewLayout(activity, resId, statusBarColor, false); } /** * 生成新界面 * * @param resId activity资源布局 * @param statusBarColor 颜色 * @param isTransparent 设置顶部是否为透明 * @return */ private StatusBarUtil getNewLayout(Activity activity, int resId, int statusBarColor, boolean isTransparent) { this.isTransparent = isTransparent; this.activity = activity; LogUtils.d("Current System version:", Build.VERSION.SDK_INT); if (systemOS == SystemOS.API00) { //Api18以下 Android 4.3及其以下 view = LayoutInflater.from(activity).inflate(resId, null); this.isTransparent = true; return this; } Window window = activity.getWindow(); window.setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); if (isTransparent) { view = LayoutInflater.from(activity).inflate(resId, null); } else { FrameLayout.LayoutParams baseParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); LinearLayout linearLayout = new LinearLayout(activity); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setLayoutParams(baseParams); View statusView = new View(activity); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.height = getStatusBarHeight(activity); statusView.setLayoutParams(layoutParams); LogUtils.d("Color:", statusBarColor); try { statusView.setBackgroundColor(statusBarColor); } catch (Exception e) { int defaultColor = Color.RED; statusView.setBackgroundColor(defaultColor); } linearLayout.addView(statusView); LayoutInflater.from(activity).inflate(resId, linearLayout, true);// linearLayout.addView(layout); view = linearLayout; } return this; } public View buildLayout() { return buildLayout(true); } /** * 创建layoutView * * @param isShowBarBackColor 清除statusBar背景色,设置是否显示半透明背景颜色 */ public View buildLayout(boolean isShowBarBackColor) { if (systemOS == SystemOS.API00 || systemOS == SystemOS.API19) { } else if (systemOS == SystemOS.API21 || systemOS == SystemOS.API23) { //5.0 6.0 if (isShowBarBackColor) { if (systemOS == SystemOS.API23) { view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); } } else { if (systemOS == SystemOS.API23) { view.setSystemUiVisibility(View.INVISIBLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); } else { view.setSystemUiVisibility(View.INVISIBLE); } } } return view; } private int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; } private enum SystemOS { API00("Android 1.1以上"), API19("Android 4.4以上"), API21("Android 5.0以上"), API23("Android 6.0以上"); String desc; SystemOS(String desc) { this.desc = desc; } }}
使用方式: 在Activity的onCreate()中使用本段代码就行:
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (isTransparentStatusBar()) { view = new StatusBarUtil().getImageLayout(mActivity, resId).buildLayout(false); } else { int color = ActivityCompat.getColor(mContext, R.color.activity_background_normal); view = new StatusBarUtil().getBaseLayout(mActivity, resId, color).buildLayout(false); } setContentView(view); }
-over-
有什么疑问可以留言
如果感觉帮到了你 提升了效率 也可以打赏一下小弟
支付宝
微信
阅读全文
0 0
- [奇技淫巧] Android 4.4 5.0 6.0 6.0+ 另一种思路的沉浸式状态栏
- [奇技淫巧] Android 4.4 5.0 6.0 另一种思路的沉浸式状态栏
- Android 6.0 沉浸式状态栏
- (解决)android不同版本的【沉浸式状态栏】(4.4/5.0/5.1/6.0)
- Android 4.4 沉浸式状态栏的实现
- 另外两种android沉浸式状态栏实现思路
- android 4.4状态栏沉浸
- Android 沉浸式状态栏
- android 沉浸式 状态栏
- android 沉浸式状态栏
- android沉浸式状态栏
- Android沉浸式状态栏
- Android 沉浸式状态栏
- android 沉浸式状态栏
- Android沉浸式状态栏
- Android沉浸式状态栏
- Android 沉浸式状态栏
- Android沉浸式状态栏
- 学习问题:使用MATLAB工具箱进行双目标定,提示索引超出矩阵范围。
- IT行业高速发展的重要原因--反摩尔定律
- 接口测试面试题
- F(x) (数位DP hdu4734)
- ActiveMQ(二)
- [奇技淫巧] Android 4.4 5.0 6.0 6.0+ 另一种思路的沉浸式状态栏
- 3-1 Point类的构造函数
- java行为设计模式——模板模式
- JAVA----对象数组排序
- 双十一的正确姿势 · qml和QT的交互初学
- python语法
- remote: Permission to xxxxx/javaeelzw.git denied to xxxx. fatal: unable to access 'https://git
- Ubuntu下sourceInsight安装
- void *变量用法