status bar處理工具類

public class StatusBarUtil {
    public static final String STATUS_BAR_TAG = "statusBar";
    public static final int DEFAULT_STATUS_BAR_ALPHA = 112;
    private static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;
    private static final int TAG_KEY_HAVE_SET_OFFSET = -123;

    /**
     * 設(shè)置狀態(tài)欄顏色
     *
     * @param activity 需要設(shè)置的 activity
     * @param color    狀態(tài)欄顏色值
     */
    public static void setColor(Activity activity, @ColorInt int color) {
        setColor(activity, color, false);
    }

    public static void setColor(Activity activity, @ColorInt int color, boolean useAlpha) {
        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, useAlpha ? Color.alpha(color) : 0));
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup)     activity.getWindow().getDecorView();
            decorView.addView(createStatusBarView(activity, color, useAlpha ? Color.alpha(color) : 0));
            setRootView(activity);
        }
    }

    /**
     * 設(shè)置狀態(tài)欄顏色
     *
     * @param activity 需要設(shè)置的 activity
     */
    public static void setColor(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(createStatusBarView(activity, Color.TRANSPARENT, 0));
            setRootView(activity);
        }
    }

    //應(yīng)用內(nèi)容占用系統(tǒng)狀態(tài)欄的空間
    public static void setFullScreen(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.x開始需要把顏色設(shè)置透明,否則導(dǎo)航欄會(huì)呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色
            Window window = activity.getWindow();
            View decorView = window.getDecorView();
            //兩個(gè) flag 要結(jié)合使用,表示讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間
            int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
            decorView.setSystemUiVisibility(option);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.TRANSPARENT);
            //導(dǎo)航欄顏色也可以正常設(shè)置
//            window.setNavigationBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window window = activity.getWindow();
            WindowManager.LayoutParams attributes = window.getAttributes();
            int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
//            int flagTranslucentNavigation =     WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
            attributes.flags |= flagTranslucentStatus;
//            attributes.flags |= flagTranslucentNavigation;
            window.setAttributes(attributes);
        }
    }

    public static void setTransparentBar(Activity activity) {
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
//            activity.getWindow().getDecorView().setSystemUiVisibility(
//                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |     View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
//            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
//        } else
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().getDecorView().setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            //狀態(tài)欄背景透明
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup)     activity.getWindow().getDecorView();
            for (int i = 0; i < decorView.getChildCount(); i++) {
                View view = decorView.getChildAt(i);
                if (STATUS_BAR_TAG.equals(view.getTag())) {
                    decorView.removeViewAt(i);
                    return;
                }
            }
        }
    }

    public static void setImage(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            //5.0及以上坝撑,不設(shè)置透明狀態(tài)欄愉择,設(shè)置會(huì)有半透明陰影
            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //是activity_main。xml中的圖片可以沉浸到狀態(tài)欄上
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            //設(shè)置狀態(tài)欄顏色透明膊畴。
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            ViewGroup decorView = (ViewGroup)     activity.getWindow().getDecorView();
            for (int i = 0; i < decorView.getChildCount(); i++) {
                View view = decorView.getChildAt(i);
                if (STATUS_BAR_TAG.equals(view.getTag())) {
                    decorView.removeViewAt(i);
                    return;
                }
            }
        }
    }

    public static int getStatusBarHeight(Context context) {
        int result = 0;
        int resId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resId > 0) {
            result = context.getResources().getDimensionPixelSize(resId);
        }
        return result;
    }

    /**
     * 生成一個(gè)和狀態(tài)欄大小相同的半透明矩形條
     *
     * @param activity 需要設(shè)置的activity
     * @param color    狀態(tài)欄顏色值
     * @param alpha    透明值
     * @return 狀態(tài)欄矩形條
     */
    private static View createStatusBarView(Activity activity, @ColorInt int color, int alpha) {
        // 繪制一個(gè)和狀態(tài)欄一樣高的矩形
        View statusBarView = new View(activity);
        statusBarView.setTag(STATUS_BAR_TAG);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));
        return statusBarView;
    }

    /**
     * 設(shè)置根布局參數(shù)
     */
    private static void setRootView(Activity activity) {
    ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);
        for (int i = 0, count = parent.getChildCount(); i < count; i++) {
            View childView = parent.getChildAt(i);
            if (childView instanceof ViewGroup) {
               childView.setFitsSystemWindows(true);
                ((ViewGroup) childView).setClipToPadding(true);
            }
        }
    }

    /**
     * 計(jì)算狀態(tài)欄顏色
     *
     * @param color color值
     * @param alpha alpha值
     * @return 最終的狀態(tài)欄顏色
     */
    private static int calculateStatusColor(@ColorInt int color, int alpha) {
        if (alpha == 0) {
            return color;
        }
        float a = 1 - alpha / 255f;
        int red = color >> 16 & 0xff;
        int green = color >> 8 & 0xff;
        int blue = color & 0xff;
        red = (int) (red * a + 0.5);
        green = (int) (green * a + 0.5);
        blue = (int) (blue * a + 0.5);
        return 0xff << 24 | red << 16 | green << 8 | blue;
    }

    /**
     * StatusBar設(shè)置為透明時(shí)掘猿,調(diào)用此方法給ToolBar 加padding
     */
    public static void setStatusBarPadding(Toolbar toolbar) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            // 不支持 4.4以下設(shè)備
            return;
       }
        if (toolbar == null) {
            return;
        }
        ViewGroup.LayoutParams layoutParams = toolbar.getLayoutParams();
        int statusBarHeight = getStatusBarHeight(toolbar.getContext());
        layoutParams.height = (int) toolbar.getContext().getResources().getDimension(R.dimen.actionbar_height) + (statusBarHeight);
        toolbar.setPadding(0, statusBarHeight, 0, 0);
    }

    /**
     * 使?fàn)顟B(tài)欄半透明
     * <p>
     * 適用于圖片作為背景的界面,此時(shí)需要圖片填充到狀態(tài)欄
     *
     * @param activity 需要設(shè)置的activity
     */
    public static void setTranslucent(Activity activity) {
        setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);
    }

    /**
     * 使?fàn)顟B(tài)欄半透明
     * <p>
     * 適用于圖片作為背景的界面,此時(shí)需要圖片填充到狀態(tài)欄
     *
     * @param activity       需要設(shè)置的activity
     * @param statusBarAlpha 狀態(tài)欄透明度
     */
    public static void setTranslucent(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        setTransparent(activity);
        addTranslucentView(activity, statusBarAlpha);
    }

    /**
     * 設(shè)置狀態(tài)欄全透明
     *
     * @param activity 需要設(shè)置的activity
     */
    public static void setTransparent(Activity activity) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return;
        }
        transparentStatusBar(activity);
        setRootView(activity);
    }

    /**
     * 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄全透明
     *
     * @param activity       需要設(shè)置的activity
     * @param needOffsetView 需要向下偏移的 View
     */
    public static void setTransparentForImageView(Activity activity, View needOffsetView) {
        setTranslucentForImageView(activity, 0, needOffsetView);
    }

    /**
     * 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄透明(使用默認(rèn)透明度)
     *
     * @param activity       需要設(shè)置的activity
     * @param needOffsetView 需要向下偏移的 View
     */
    public static void setTranslucentForImageView(Activity activity, View needOffsetView) {
        setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);
    }

    /**
     * 為頭部是 ImageView 的界面設(shè)置狀態(tài)欄透明
     *
     * @param activity       需要設(shè)置的activity
     * @param statusBarAlpha 狀態(tài)欄透明度
     * @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);
        }
    }

    /**
     * 設(shè)置透明
     */
    private static void setTransparentForWindow(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
            activity.getWindow()
                .getDecorView()
                .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            activity.getWindow()
                .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    /**
     * 添加半透明矩形條
     *
     * @param activity       需要設(shè)置的 activity
     * @param statusBarAlpha 透明值
     */
    private static void addTranslucentView(Activity activity, @IntRange(from = 0, to = 255) int statusBarAlpha) {
        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
        View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);
        if (fakeTranslucentView != null) {
            if (fakeTranslucentView.getVisibility() == View.GONE) {
                fakeTranslucentView.setVisibility(View.VISIBLE);
            }
            fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));
        } else {
            contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));
        }
    }

    /**
     * 使?fàn)顟B(tài)欄透明
     */
    @TargetApi(Build.VERSION_CODES.KITKAT)
    private static void transparentStatusBar(Activity activity) {
        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().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        } else {
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

    /**
     * 創(chuàng)建半透明矩形 View
     *
     * @param alpha 透明值
     * @return 半透明 View
     */
    private static View createTranslucentStatusBarView(Activity activity, int alpha) {
       // 繪制一個(gè)和狀態(tài)欄一樣高的矩形
        View statusBarView = new View(activity);
        LinearLayout.LayoutParams params =
            new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
        statusBarView.setLayoutParams(params);
        statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
        statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);
        return statusBarView;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市唇跨,隨后出現(xiàn)的幾起案子稠通,更是在濱河造成了極大的恐慌衬衬,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件改橘,死亡現(xiàn)場(chǎng)離奇詭異滋尉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)飞主,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門兼砖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人既棺,你說我怎么就攤上這事讽挟。” “怎么了丸冕?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵耽梅,是天一觀的道長。 經(jīng)常有香客問我胖烛,道長眼姐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任佩番,我火速辦了婚禮众旗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟畏。我一直安慰自己贡歧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布赋秀。 她就那樣靜靜地躺著利朵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猎莲。 梳的紋絲不亂的頭發(fā)上绍弟,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音著洼,去河邊找鬼樟遣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛身笤,可吹牛的內(nèi)容都是我干的豹悬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼展鸡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼屿衅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起莹弊,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤涤久,失蹤者是張志新(化名)和其女友劉穎涡尘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體响迂,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡考抄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蔗彤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片川梅。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖然遏,靈堂內(nèi)的尸體忽然破棺而出贫途,到底是詐尸還是另有隱情,我是刑警寧澤待侵,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布丢早,位于F島的核電站,受9級(jí)特大地震影響秧倾,放射性物質(zhì)發(fā)生泄漏怨酝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一那先、第九天 我趴在偏房一處隱蔽的房頂上張望农猬。 院中可真熱鬧,春花似錦售淡、人聲如沸斤葱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苦掘。三九已至换帜,卻和暖如春楔壤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惯驼。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工蹲嚣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祟牲。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓隙畜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親说贝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子议惰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容