Android 沉浸式狀態(tài)欄

1.設(shè)置沉浸式狀態(tài)欄

public static void setStatusBarColor(Activity activity,int color){
       
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){  // 5.0 以上
            activity.getWindow().setStatusBarColor(color); // 直接調(diào)用系統(tǒng)提供的方法 setStatusBarColor
        }
        // 4.4 - 5.0 之間  采用一個技巧佑附,首先把他弄成全屏,在狀態(tài)欄的部分加一個布局
        else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            // 首先把他弄成全屏()麸塞,在狀態(tài)欄的部分加一個布局
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

            // 在狀態(tài)欄的部分加一個布局 setContentView 源碼分析半沽,自己加一個布局 (高度是狀態(tài)欄的高度)
            View view = new View(activity);
            ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,getStatusBarHeight(activity));
            view.setLayoutParams(params);
            view.setBackgroundColor(color);
            
            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
            decorView.addView(view);

            // 獲取activity中setContentView布局的根布局
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            contentView.setPadding(0,getStatusBarHeight(activity),0,0);
            
            // View activityView = contentView.getChildAt(0);
            // activityView.setPadding(0,getStatusBarHeight(activity),0,0);

            // activityView.setFitsSystemWindows(true);    
        }
    }

獲取狀態(tài)欄高度

// 獲取狀態(tài)欄的高度
private static int getStatusBarHeight(Activity activity) {
    Resources resources = activity.getResources();
    int statusBarHeightId = resources.getIdentifier("status_bar_height","dimen","android");
   return resources.getDimensionPixelOffset(statusBarHeightId);
}

2.設(shè)置Activity全屏

    public static void setActivityTranslucent(Activity activity){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            View decorView = activity.getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);
        }
        else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

3.修改狀態(tài)欄字體顏色(白底黑字)

3.1 Android6.0以上

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Window window = activity.getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(Color.WHITE);
            window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }

3.2Android4.4-6.0之間

3.2.1適配MIUI(小米)

public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {
        Class<? extends Window> clazz = activity.getWindow().getClass();
        try {
            int darkModeFlag = 0;
            Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

3.2.2適配Flyme(魅族)

    public static boolean setMeizuStatusBarDarkIcon(Activity activity, boolean dark) {
        boolean result = false;
        if (activity != null) {
            try {
                WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
                Field darkFlag = WindowManager.LayoutParams.class
                        .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
                Field meizuFlags = WindowManager.LayoutParams.class
                        .getDeclaredField("meizuFlags");
                darkFlag.setAccessible(true);
                meizuFlags.setAccessible(true);
                int bit = darkFlag.getInt(null);
                int value = meizuFlags.getInt(lp);
                if (dark) {
                    value |= bit;
                } else {
                    value &= ~bit;
                }
                meizuFlags.setInt(lp, value);
                activity.getWindow().setAttributes(lp);
                result = true;
            } catch (Exception e) {
            }
        }
        return result;
    }

3.2.3其他

// 我們將狀態(tài)欄設(shè)置為一個淡灰色波势,例:支付寶或辖,今日頭條等
setStatusBarColor(activity,Color.parseColor("#33000000"))

4. 狀態(tài)欄顏色漸變過渡算法

    /**
     * 合成新的顏色值
     * @param fraction 顏色取值的級別 (0.0f ~ 1.0f)
     * @param startValue 開始顯示的顏色
     * @param endValue 結(jié)束顯示的顏色
     * @return 返回生成新的顏色值
     */
    public static int evaluate(float fraction, int startValue, int endValue) {
        int startA = (startValue >> 24) & 0xff;
        int startR = (startValue >> 16) & 0xff;
        int startG = (startValue >> 8) & 0xff;
        int startB = startValue & 0xff;

        int endA = (endValue >> 24) & 0xff;
        int endR = (endValue >> 16) & 0xff;
        int endG = (endValue >> 8) & 0xff;
        int endB = endValue & 0xff;

        return ((startA + (int) (fraction * (endA - startA))) << 24) |
                ((startR + (int) (fraction * (endR - startR))) << 16) |
                ((startG + (int) (fraction * (endG - startG))) << 8) |
                ((startB + (int) (fraction * (endB - startB))));
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市橙依,隨后出現(xiàn)的幾起案子证舟,更是在濱河造成了極大的恐慌,老刑警劉巖窗骑,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件女责,死亡現(xiàn)場離奇詭異,居然都是意外死亡创译,警方通過查閱死者的電腦和手機(jī)抵知,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刷喜,你說我怎么就攤上這事残制。” “怎么了掖疮?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵初茶,是天一觀的道長。 經(jīng)常有香客問我浊闪,道長纺蛆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任规揪,我火速辦了婚禮桥氏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猛铅。我一直安慰自己字支,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布奸忽。 她就那樣靜靜地躺著堕伪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栗菜。 梳的紋絲不亂的頭發(fā)上欠雌,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音疙筹,去河邊找鬼富俄。 笑死,一個胖子當(dāng)著我的面吹牛而咆,可吹牛的內(nèi)容都是我干的霍比。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼暴备,長吁一口氣:“原來是場噩夢啊……” “哼悠瞬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涯捻,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浅妆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后障癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凌外,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年混弥,在試婚紗的時候發(fā)現(xiàn)自己被綠了趴乡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蝗拿,死狀恐怖晾捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哀托,我是刑警寧澤惦辛,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站仓手,受9級特大地震影響胖齐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗽冒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一呀伙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧添坊,春花似錦剿另、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阳准,卻和暖如春氛堕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背野蝇。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工讼稚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绕沈。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓乱灵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親七冲。 傳聞我的和親對象是個殘疾皇子痛倚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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