91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android實現狀態欄(statusbar)漸變效果的示例

發布時間:2020-09-26 05:36:14 來源:腳本之家 閱讀:222 作者:Jlanglang 欄目:移動開發

前言

qq最近更新搞了漸變式狀態欄.然后...新需求就是要加這個.唉

先來張效果圖:

Android實現狀態欄(statusbar)漸變效果的示例

常見的方式:

設置Theme,狀態欄透明.

 <item name="android:windowTranslucentStatus">true</item>

實現起來比較簡單.

比如:SystemBarTint

幾行代碼搞定了.

但是.我要潑冷水,這種方式會引起這些問題:

1.軟鍵盤彈起bug
2.fragment不適應

這種方式的優點:

兼容到4.4

我的看法:

1.用全屏模式或者狀態欄透明的方式去實現,感覺很勉強
2.為了一個statusbar的效果,然后去處理一大堆不適應,我認為是不值得的.特別是軟鍵盤彈出的問題
3.如果為了適配4.4,要費這么大功夫的話...

我的實現方式:

1.拿到StatusBar:

很簡單,翻翻DecorView源碼,就能知道,是通過ColorViewState 配置創建的View.

Android實現狀態欄(statusbar)漸變效果的示例

Android實現狀態欄(statusbar)漸變效果的示例

由于是私有成員,要拿到對應的參數,一般做法是使用反射.

這里我取了點巧,既然是View,那么就能findviewbyId找到

只要想辦法拿到com.android.internal.R.id.statusBarBackground這個id值就行了

 private void initStatusBar() {
    if (statusBarView == null) {
      //android系統級的資源id得這么拿,不然拿不到
      int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
      statusBarView = getWindow().findViewById(identifier);
    }
    if (statusBarView != null) {
      statusBarView.setBackgroundResource("你的漸變drawable資源id");
    }
  }

2.等StatusBar繪制完成

如果你直接在onCreate中調用上面的方法,你會發現,拿到的是null.

這是因為Statusbar還沒繪制完成.

所以,可以在onCreate()中使用Looper.myQueue().addIdleHandler()來保證Statusbar繪制完成后再findview.

然后對DecorView設置addOnLayoutChangeListener監聽

當布局發生變化,就設置statusbar的背景

    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
      @Override
      public boolean queueIdle() {
        if (isStatusBar()) {
          initStatusBar();
          getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
              initStatusBar();
            }
          });
        }
        return false;
      }
    });

3.為什么要addOnLayoutChangeListener:

其實不加監聽,也能實現改變statusbar顏色的效果..但是會出現問題

比如彈軟鍵盤后,彈popwindow后,引起window狀態改變時,statusbar的顏色就會復原...

基本完整的代碼

  private View statusBarView;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    //延時加載數據.
    Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
      @Override
      public boolean queueIdle() {
        if (isStatusBar()) {
          initStatusBar();
          getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
              initStatusBar();
            }
          });
        }
        //只走一次
        return false;
      }
    });
  }
  private void initStatusBar() {
    if (statusBarView == null) {
      int identifier = getResources().getIdentifier("statusBarBackground", "id", "android");
      statusBarView = getWindow().findViewById(identifier);
    }
    if (statusBarView != null) {
        statusBarView.setBackgroundResource("你的漸變drawable資源id");
    }
  }

   protected boolean isStatusBar() {
    return true;
  }

這種方式的缺點:

1.因為沒有使用全屏的模式,所以適配4.4是沒戲了.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

深水埗区| 稷山县| 依兰县| 吉木萨尔县| 青冈县| 尚义县| 忻州市| 琼海市| 商丘市| 隆尧县| 息烽县| 莆田市| 西藏| 凤翔县| 怀远县| 盐源县| 淮阳县| 宾川县| 秦皇岛市| 南阳市| 麻栗坡县| 佳木斯市| 平武县| 土默特左旗| 赣州市| 邓州市| 新丰县| 竹溪县| 十堰市| 嵊泗县| 宁德市| 烟台市| 阿尔山市| 海兴县| 沁水县| 内丘县| 达日县| 水城县| 隆昌县| 公安县| 五家渠市|