更简单更全的material design状态栏

从实际使用需要出发,以最简单的方式实现了几种类型的MD状态栏。(重点在fitsSystemWindows的使用)

0,使用前提

Theme.AppCompat.Light.DarkActionBar

targetSdkVersion 23;

support librariy 23.3.0

styles-v19: <item name="android:windowTranslucentStatus">true</item>

styles-v21+: <item name="android:windowDrawsSystemBarBackgrounds">true</item>  <item name="android:statusBarColor">@android:color/transparent</item>

1,最普通的类型:只有一个ToolBar

layout:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

        <android.support.v7.widget.Toolbar
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"/>

    </android.support.design.widget.AppBarLayout>

</android.support.design.widget.CoordinatorLayout>

.java:

/**
 * 简单型状态栏(ToolBar)
 *
 * @param activity
 */
public static void setOrdinaryToolBar(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, R.color.colorPrimaryDark));
    } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
        setKKStatusBar(activity, R.color.colorPrimaryDark);
    }
}

效果:

左:Android4.4  右:Android6.0

2,图片全屏透明状态栏(图片位于状态栏下面)

layout:

<android.support.design.widget.CoordinatorLayout>

    <ImageView/>

    <android.support.v7.widget.Toolbar
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"/>

</android.support.design.widget.CoordinatorLayout>

.java

/**
 * 图片全屏透明状态栏(图片位于状态栏下面)
 *
 * @param activity
 */
public static void setImageTransparent(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
}

效果:

左:Android4.4  右:Android6.0

3,图片全屏半透明状态栏(图片位于状态栏下面)

layout:

<android.support.design.widget.CoordinatorLayout>

    <ImageView/>

    <android.support.v7.widget.Toolbar
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"/>

</android.support.design.widget.CoordinatorLayout>

.java:

/**
 * 图片全屏半透明状态栏(图片位于状态栏下面)
 *
 * @param activity
 */
public static void setImageTranslucent(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, R.color.statusBar));
    } else {
        setKKStatusBar(activity, R.color.statusBar);
    }
}

效果:

左:Android4.4  右:Android6.0

4,ToolBar+TabLayout状态栏(ToolBar可伸缩)

layout:

<android.support.design.widget.CoordinatorLayout
    android:background="@color/colorPrimaryDark"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout>

        <android.support.v7.widget.Toolbar
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways|snap"/>

        <android.support.design.widget.TabLayout/>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView/> 

</android.support.design.widget.CoordinatorLayout>

.java:

/**
 * ToolBar+TabLayout状态栏(ToolBar可伸缩)
 *
 * @param activity
 */
public static void setToolbarTabLayout(Activity activity) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        activity.getWindow().setStatusBarColor(ContextCompat.getColor(activity, R.color.colorPrimaryDark));
    }
}

效果:

Android4.4:

Android6.0:

5,DrawerLayout+ToolBar+TabLayout状态栏(ToolBar可伸缩)

layout:

<android.support.v4.widget.DrawerLayout
    android:fitsSystemWindows="true">

    <android.support.design.widget.CoordinatorLayout
        android:background="@color/colorPrimary">

        <android.support.design.widget.AppBarLayout>

            <android.support.v7.widget.Toolbar
                android:layout_height="wrap_content"
                app:layout_scrollFlags="scroll|enterAlways|snap"/>

            <android.support.design.widget.TabLayout/>

        </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.NestedScrollView
            android:background="@android:color/white"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:fitsSystemWindows="true"/>

</android.support.v4.widget.DrawerLayout>

.java:

/**
 * DrawerLayout+ToolBar+TabLayout状态栏(ToolBar可伸缩)
 *
 * @param activity
 * @param drawerLayout
 * @param coordinatorLayout
 */
public static void setDrawerToolbarTabLayout(Activity activity, CoordinatorLayout coordinatorLayout) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
        ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content);
        contentLayout.getChildAt(0).setFitsSystemWindows(false);
        coordinatorLayout.setFitsSystemWindows(true);
        setKKStatusBar(activity, R.color.statusBar);
    }
}

效果:

Android4.4:

Android6.0:

6,CollapsingToolbarLayout状态栏(可折叠图片)

layout:

<android.support.design.widget.CoordinatorLayout
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:fitsSystemWindows="true">

        <android.support.design.widget.CollapsingToolbarLayout>

            <ImageView
                android:fitsSystemWindows="true"/>

            <android.support.v7.widget.Toolbar
                android:layout_height="?attr/actionBarSize"
                app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"/>

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/> 

</android.support.design.widget.CoordinatorLayout>

.java:

/**
 * CollapsingToolbarLayout状态栏(可折叠图片)
 *
 * @param activity
 * @param coordinatorLayout
 * @param appBarLayout
 * @param imageView
 * @param toolbar
 */
public static void setCollapsingToolbar(Activity activity, CoordinatorLayout coordinatorLayout,
                                        AppBarLayout appBarLayout, ImageView imageView, Toolbar toolbar) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
        coordinatorLayout.setFitsSystemWindows(false);
        appBarLayout.setFitsSystemWindows(false);
        imageView.setFitsSystemWindows(false);
        toolbar.setFitsSystemWindows(true);
        CollapsingToolbarLayout.LayoutParams lp = (CollapsingToolbarLayout.LayoutParams) toolbar.getLayoutParams();
        lp.height = (int) (getStatusBarHeight(activity) +
                activity.getResources().getDimension(R.dimen.abc_action_bar_default_height_material));
        toolbar.setLayoutParams(lp);
        setKKStatusBar(activity, R.color.statusBar);
        setCollapsingToolbarStatus(appBarLayout);
    }
}

效果:

Android4.4:

Android6.0:

7,DrawerLayout+ToolBar型状态栏

layout:

<android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.AppBarLayout>

        <android.support.v7.widget.Toolbar
            android:layout_height="wrap_content"
            android:fitsSystemWindows="true"/>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main"/>

</android.support.design.widget.CoordinatorLayout>

.java:

/**
 * DrawerLayout+ToolBar型状态栏
 *
 * @param activity
 */
public static void setDrawerToolbar(Activity activity) {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) {
        ViewGroup contentLayout = (ViewGroup) activity.findViewById(android.R.id.content);
        contentLayout.getChildAt(0).setFitsSystemWindows(false);
        setKKStatusBar(activity, R.color.statusBar);
    }
}

其它:

/**
 * Android4.4CollapsingToolbar折叠时statusBar显示和隐藏
 *
 * @param appBarLayout
 */
private static void setCollapsingToolbarStatus(AppBarLayout appBarLayout) {
    ViewCompat.setAlpha(mStatusBarView, 1);
    appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
        @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            int maxScroll = appBarLayout.getTotalScrollRange();
            float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll;
            ViewCompat.setAlpha(mStatusBarView, percentage);
        }
    });
}

private static void setKKStatusBar(Activity activity, int statusBarColor) {
    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    mStatusBarView = contentView.getChildAt(0);
    //改变颜色时避免重复添加statusBarView
    if (mStatusBarView != null && mStatusBarView.getMeasuredHeight() == getStatusBarHeight(activity)) {
        mStatusBarView.setBackgroundColor(ContextCompat.getColor(activity, statusBarColor));
        return;
    }
    mStatusBarView = new View(activity);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
            getStatusBarHeight(activity));
    mStatusBarView.setBackgroundColor(ContextCompat.getColor(activity, statusBarColor));
    contentView.addView(mStatusBarView, lp);
}

private static int getStatusBarHeight(Context context) {
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    return context.getResources().getDimensionPixelSize(resourceId);
}

效果:

Android4.4:

Android6.0:

OK!

源码地址:https://github.com/XYScience/MDStatusBar

时间: 2024-08-27 17:39:55

更简单更全的material design状态栏的相关文章

简悦浏览器:智能插件让阅读更简单更愉悦

简悦浏览器 是一款专为iOS手机用户设计和开发的优化阅读浏览器工具,简悦浏览器通过自主开发的智能转码引擎和ACP插件可以无缝将一个普通的网站深度优化,为手机用户提供赏心悦目的阅读浏览体验.当用户使用简悦浏览器访问知名中文论坛和小说网站时,简悦浏览器会自动发现和提供最佳的转码服务,目前已经支持100+以上网站的深度优化. 简悦浏览器主要由浏览器界面.浏览器内核.智能转码引擎和浏览器插件四部分组成,如下图示. 浏览器内核?-指浏览器的渲染引擎.简悦浏览器内核采用WeKit.WebKit渲染引擎又包含

更快更简单更美观——Power-BI V9.0隆重发版

继Power-BIV8.0发布后,经过11个月的精心准备,Power-BI V9.0隆重发布!Power-BI V9.0在原有基础上,在软件操作性.美观性.易用性.效率等方面进行了不断地完善与提升,让BI的开发与应用变得更快更简单更美观! 1. 真正做到5分钟制作一个信息量大.操作简易且美观大方的管理驾驶舱. 不同的管理角色,对管理驾驶舱的需求都是不同的:同一个管理角色,在不同的时期,其对KPI的关注也是不同的.那么,如何能快速制作部署满足上述场景的管理驾驶舱呢?Power-BI在众多细节上进行

[翻译和注解]Kafka Streams简介: 让流处理变得更简单

Introducing Kafka Streams: Stream Processing Made Simple 这是Jay Kreps在三月写的一篇文章,用来介绍Kafka Streams.当时Kafka Streams还没有正式发布,所以具体的API和功能和0.10.0.0版(2016年6月发布)有所区别.但是Jay Krpes在这简文章里介绍了很多Kafka Streams在设计方面的考虑,还是很值得一看的. 以下的并不会完全按照原文翻译,因为那么搞太累了……这篇文件的确很长,而且Jay

【知识必备】一文让你搞懂design设计的CoordinatorLayout和AppbarLayout联动,让Design设计更简单~

一.写在前面 其实博主在之前已经对design包的各个控件都做了博文说明,无奈个人觉得理解不够深入,所以有了这篇更加深入的介绍,希望各位看官拍砖~ 二.从是什么开始 1.首先我们得知道CoordinatorLayout是什么玩意儿,到底有什么用,我们不妨看看官方文档的描述: CoordinatorLayout是一个"加强版"FrameLayout,它主要有两个用途: 1.用作应用的顶层布局管理器,也就是作为用户界面中所有UI控件的容器 2.用作相互之间具有特定交互行为的UI控件的容器

Android动画最新最全详解包含Material Design动画

以前写动画也是零零种种,需要的时候就查API或找现成的,不够系统.现在通过学习将Android整个动画体系勾勒出来,做到有的放矢. 安卓框架提供了2个动画系统:属性动画(Android 3.0)和View动画.这两种动画系统都是可行的,但是,在一般情况下,属性动画是首选的方法,因为它是更灵活,提供更多的功能.除了这两个系统,你可以利用Drawable动画,它允许你一帧一个的加载显示Drawable资源.所以总体来说Android API提供了三类的动画: - Tween动画或View动画(API

TFS 2010 让安装更简单,也让VSS成为历史

一转眼VS 2010 RC(Release Candidate)版本号已经公布一月多了,RTM(Release To Manufacturer)版本号也快妥了,已经进入了最后的倒计时,仅仅等4月12号公布了.TFS 2010也将一起正式公布,相对于2005和2008,2010将是具有里程碑意义的一个版本号,就像它总设计师Brian Harry在以下的Channel 9採訪中所描写叙述的:“TFS 2005是TFS 1.0版,2008则是1.5,而2010则是2.0版”. Brian Harry:

OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。

okhttp-OkGo 项目地址:jeasonlzy/okhttp-OkGo 简介:OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用.该库是封装了 okhttp 的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持 Https 和自签名证书,支持 cookie 的持久化和自动管理,支持四种缓存模式缓存网络数据,支持 301 和 302 重定向,扩展了

云如何让App开发更简单?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 互联网"下半场",移动App开发对于质量.速度的要求更加苛刻.4月初,腾讯云正式上线移动开发平台MobileLine,借助腾讯在移动应用开发领域的成熟积累,帮助移动开发者低成本.快速的构建弹性.高质量的精品应用. 短短几天,就有几百个移动开发者申请接入使用. 一.简单.高效才是王道,腾讯内部移动开发百花齐放 腾讯一直积极拥抱移动互联网,打造了众多的精品应用.实际上,对于支撑移动开发的各种服务,腾讯内部也是百花齐放,比如移动分析

使用讯商仓库管理软件,让仓库管理更简单!

使用讯商仓库管理软件,让仓库管理更简单!生活中有很多的仓库管理软件,而且很多的仓库运用仓库管理软件,仓库管理运用仓库管理软件有哪些优势呢? 1.入库:只需求将物品放置在对应位置,读取标签,加上相应的数量即可.2.出库:只需求手持机读取标签,减去响应数量的产品,之后取走产品.3.预警:当某一物品在取走时,数量缺乏预设的数量时,会手持机显现提示.4.在库数量查看与预警:人员在手持设备上即可查看,如今每件物品的在库数量.数量缺乏的产品,以橙色提示.完整耗费用尽的产品,以红色提示.5.增加品类与减少品类