状态栏透明而实现 "沉浸式" 及兼容问题

摘要:
P=741)java代码实现了状态栏的透明度:@TargetApublicstaticvoidsetTransparentBar{if{//Android 5.0及以上版本加上Flag直接实现了状态条的透明度Windowwindow=activity.getWindow();ViewdecoView=window.getDecorView() ; intoption=视图。SYSTEM_ UI_ FLAG_布局_隐藏_导航|视图。SYSTEM_ UI_ FLAG_ LAYOUT_ FULLSCREEN|视图。SYSTEM_ UI _ FLAG _ LAYOUT _ STABLE;decoView。setSystemUiVisibility;intfinalColor=alpha==0?颜色。透明度:颜色。argb;窗setStatusBarColor;}Elseif{//Android 4.4以上版本获取docoeView并设置docoeView的透明颜色Windowwindow=activity.getWindow();window.addFlags;ViewGroupdecorView=window.getDecorView();intelColor=alpha==0?

---恢复内容开始---

拖了好久  终于有空可以把这个新学的东西输出出来了.也是为了以后可以回来看看吧.

现在很流行ios式的状态栏  不过确实很酷炫.网上相关文章可多了 有点杂感觉都没太点透 ,我来试试能不能点透一点点.

先上图吧;

1:xml背景(5.0)

状态栏透明而实现 "沉浸式" 及兼容问题第1张

2:图片背景(5.0)

状态栏透明而实现 "沉浸式" 及兼容问题第2张

3:xml背景(5.0)

状态栏透明而实现 "沉浸式" 及兼容问题第3张

4.安卓4.3系统上 状态栏透明不了 所以一条黑黑的背景  android studio传不上来

4.4系统的手机上实现效果也不错 这也就可以说满足  实现了据说的  "沉浸式"顶部栏吧.

其实没那么复杂 思路上分"两步走"

1:状态栏变透明

2:状态栏下面的 contentview设置padding_top 去重叠.

补充知识点:

ui层级关系:activity>phoneWindow(Framlaout)>decorView(LinearLayout)>titleView(我的理解是 statebar和 actionbar的容器)+ContentView+ActionBar

我们要处理的就是 decorView.

先说4.4如何实现"两步走"

补充点:在manifest里面 需要透明栏的 activity的 theme设置为(Activity必须使用Theme.AppCompat主题及其子主题)

            android:theme="@style/MyAppCompatNoActionBar"

 第一步:实现透明状态栏

   <style name="MyAppCompatNoActionBar" parent="Theme.AppCompat.Light">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>                                 // 前两个保持和application的theme一样  特别app没有的时候 activity不能有 会空指针
                        //   <item name="android:windowBackground">@android:color/transparent</item>                //  设置启动页面的初始页面  跟两步走  没关系!!!!   但是感觉有点意思  下面推荐个链接详解这个
        <item name="android:windowIsTranslucent">true</item>                          //xml实现透明状态栏 对于很多国产手机会失效 所以建议在java代码中再实现一遍
    </style>

(详解windowbackground:             http://blog.chengyunfeng.com/?p=741)

java代码实现状态栏透明(自己封装的StatusBarUtils):

    @TargetApi(Build.VERSION_CODES.KITKAT)
    public static void setTransparentBar(Activity activity, @ColorInt int color, int alpha) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//安卓5.0以上 加Flag直接实现透明状态栏
            Window window = activity.getWindow();
            View decorView = window.getDecorView();
            int option = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);

            int finalColor = alpha == 0 ? Color.TRANSPARENT :
                    Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));

            window.setStatusBarColor(finalColor);

        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){//安卓4.4以上 获取docoeView并给docoeView设置透明色
            Window window = activity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup) window.getDecorView();
            int finalColor = alpha == 0 ? Color.TRANSPARENT :
                    Color.argb(alpha, Color.red(color), Color.green(color), Color.blue(color));


            decorView.addView(createStatusBarView(activity, finalColor));

        }//4.4一下实现不了。。

    }

 第二步:将要显示的页面挪下来,使之不遮挡状态栏

 (自己封装的StatusBarUtils)

 //获取状态栏高度
    public static int getStatusBarHeight(Context context) {
        int result = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
            if (resourceId > 0) {
                result = context.getResources().getDimensionPixelSize(resourceId);
            }
        }
        return result;
    }

要实现透明状态栏的view中:

  mIStatusHeight = StatusBarUtils.getStatusBarHeight(this);    //会根据安卓版本返回不同值 4.4以下:0;4.4及4.4以上 返回系统statusbar高度
  mIToolbarHeightHome = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                48, getResources().getDisplayMetrics());    //咱们要显示页面的第一个view的高度
 FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) mToolbar.getLayoutParams();//
 lp.height = mIStatusHeight + mIToolbarHeightHome;    //实际view的高度要加上statusbar的高度,因为后面要padingtop 减去statusbar的高度.
 mToolbar.setPadding(0, mIStatusHeight, 0, 0);    //减去statusbar的高度.避免覆盖statusbar

view可以设置图片也可以设置xml;图片考虑压缩变形问题

 然后就完成啦~

最后tip一个:对于4.4的vivo,无法实现透明状态栏.亲测.

免责声明:文章转载自《状态栏透明而实现 "沉浸式" 及兼容问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转载】JExcelApi(JXL)学习笔记创建kafkatopic和productor下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Unity开发Android的几种调试方法

前言 本文举例几种Android 调试的方法(PS:我是通过unity引擎来开发安卓游戏) Eclipse + adt 查看LOG 1、为Eclipse 装上adt 插件 2、打开Eclipse 的Logcat,在搜索栏中输入 tag:unity Android Studio 自带adt Android SDK自带的 Monotor 1、找到 andro...

Android Studio安装及主题字体配置

   在2013 Google I/O 大会上,谷歌推出了自家全新的安卓软件集成开发工具 Android Studio,这是 Google 基于 IntelliJ IDEA 改动而来。        谷歌称 Android Studio 将会让开发人员更快、更具生产力,它全然免费,跨平台支持 Win/Mac/Linux,是替代 Eclipse 的最佳...

Android 多分辨率自适应总结

这周的工作对Android项目多分辨率自适应进行调整。故对这方面知识进行不断的尝试学习。Android项目刚開始做的时候一定养成编程习惯,全部资源调用放在value中。统一命名以及管理。总结了下面内容。一、一般基本原则以及总结1、xml布局中不要写死, 既单位不要用px。尽量用dp,或者match、warp2、应该尽量把资源图片设计成能够拉伸的.9图,假...

&amp;lt;Android基础&amp;gt;(一)

第一章Android 2003年10月,Andy Rubin等人创办了Android公司。2005年8月谷歌收购。 1.1 Android全貌 1.1.1 Android系统架构 1.Linux内核层:为Android设备的各种硬件提供底层驱动。如:显示驱动,音频驱动,蓝牙驱动,WiFi驱动,电源管理。 2.系统运行库层:c/c++库为Android层提供...

Android将view保存为图片并放在相册中

  在Android中,可以将view保存为图片并放在相册中,步骤为 view->bitmap->file,即先将view转化为bitmap,再将bitmap保存到相册中。      需要将红框标注的view转化为图片并保持到相册中。view的XML代码为 <RelativeLayout android:i...

【Android实验】组件通信Intent

实验目的 目录 实验目的 实验要求 实验结果 实验代码 father.xml:主界面文件 content_child.xml:子界面 Fourth.java: 处理文件 ChildActivity.java: 子界面处理文件 实验总结 了解使用Intent进行组件通信原理 掌握使用Intent启动Activity的方法 熟悉和掌握A...