AbsStatusBar.java
4.02 KB
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();
}
}