Blame view

C5/statusBar/src/main/java/com/sunvote/statusbar/AbsStatusBar.java 4.02 KB
fac86401   孙向锦   初始化C5 Vote
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  package com.sunvote.statusbar;
  
  import android.app.Service;
  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.content.IntentFilter;
  import android.graphics.PixelFormat;
  import android.os.IBinder;
  import android.view.Gravity;
  import android.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.view.WindowManager;
  
  import com.sunvote.statusbar.view.BarItem;
  import com.sunvote.statusbar.view.StatusBar;
  
  /**
   * 自定义状态栏
   * {@link #getStatusBarLayoutId()} 通过Xml配置状态栏
   * {@link #initStatusBar(StatusBar)}通过代码创建状态栏
   * @author
   */
  public abstract class AbsStatusBar extends Service {
  
      /**
       * {@link android.view.View#GONE}{@link android.view.View#VISIBLE}
       */
      public static final String EXTRA_STATE = "me.kaini.extra.STATE";
  
      /**
       * 状态栏的状态
       * {@link #EXTRA_STATE}
       */
      public static final String ACTION_STATUS_BAR_STATE = "me.kaini.intent.action.STATUS_BAR_STATE";
  
      private WindowManager winMgr;
  
      private StatusBar statusBar;
  
      private int mStatusBarHeight;
  
      private BroadcastReceiver mStatusBarStateReceiver = new BroadcastReceiver() {
          @Override
          public void onReceive(Context context, Intent intent) {
              int visibility = intent.getExtras().getInt(EXTRA_STATE, View.VISIBLE);
              setStatusBarVisibility(visibility);
          }
      };
  
      @Override
      public void onCreate() {
          super.onCreate();
          winMgr = (WindowManager)getSystemService(Context.WINDOW_SERVICE);
  
          statusBar = getStatusBar();
  
          initStatusBar(statusBar);
  
          statusBar.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
          mStatusBarHeight = statusBar.getMeasuredHeight();
  
          winMgr.addView(statusBar, getStatusBarLayoutParams(mStatusBarHeight));
  
          IntentFilter statusBarFilter = new IntentFilter(ACTION_STATUS_BAR_STATE);
          registerReceiver(mStatusBarStateReceiver, statusBarFilter);
  
      }
  
      protected void setStatusBarVisibility(int visibility){
          statusBar.setVisibility(visibility);
      }
  
      private StatusBar getStatusBar(){
          LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  
          ViewGroup v = (ViewGroup)inflater.inflate(getStatusBarLayoutId(), null);
  
          StatusBar statusBar;
          if(v instanceof  StatusBar){
              statusBar = (StatusBar)v;
          }else{
              statusBar = new StatusBar(this);
              int childCount = v.getChildCount();
              for (int i = 0; i < childCount; i++){
                  BarItem item = (BarItem)v.getChildAt(i);
                  statusBar.addItem(item, i);
              }
          }
          return statusBar;
      }
  
      protected WindowManager.LayoutParams getStatusBarLayoutParams(int statusBarHieght){
          WindowManager.LayoutParams wlp = new WindowManager.LayoutParams();
  
          wlp.format = PixelFormat.TRANSPARENT;
  
          wlp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                  | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
  
          wlp.x = 0;
          wlp.y = 0;
  
          wlp.height = statusBarHieght;
          wlp.width = ViewGroup.LayoutParams.MATCH_PARENT;
          wlp.type = WindowManager.LayoutParams.TYPE_PHONE;
          wlp.gravity = getStatusBarGravity();
          return wlp;
      }
  
      @Override
      public IBinder onBind(Intent intent) {
          return null;
      }
  
      /**
       * 获取状态栏布局,Root
       * @return
       */
      protected abstract int getStatusBarLayoutId();
  
      /**
       * 初始化状态图标
       * @param statusBar
       */
      protected void initStatusBar(StatusBar statusBar){}
  
      protected int getStatusBarGravity(){
          return Gravity.LEFT | Gravity.BOTTOM;
      }
  
      @Override
      public void onDestroy() {
          unregisterReceiver(mStatusBarStateReceiver);
          winMgr.removeView(statusBar);
          super.onDestroy();
      }
  }