您的位置:首页 > 移动开发 > Android开发

android 源代码研究之----frameworks-----status bar 状态栏

2011-03-10 15:57 363 查看
相关的文件位置

Eclair/frameworks/base/core/res/res目录下的

/layout/status_bar.xml

/values/arrays.xml

 

 

/Eclair/frameworks/base/services/java/com/android/server/status目录下的

StatusBarService.java

StatusBarView.java

StatusBarPolicy.java

 

//GJL
StatusBarView.java
int mResvKeyState = -1;  //记住的上次按键状态, -1为无状态。
int mResvKeyCode  = -1;  //记住的上次按键值,-1为无状态
ImageView mHomeIcon;
ImageView mBackIcon;
ImageView mMenuIcon;
public static final int RESV_KEY_HOME = KeyEvent.KEYCODE_HOME;
public static final int RESV_KEY_BACK = KeyEvent.KEYCODE_BACK;
public static final int RESV_KEY_MENU = KeyEvent.KEYCODE_MENU;

@Override
protected void onFinishInflate() {
//change by GJL for bar
mHomeIcon = (ImageView)findViewById(R.id.status_home);
mBackIcon = (ImageView)findViewById(R.id.status_back);
mMenuIcon = (ImageView)findViewById(R.id.status_menu);
//end
super.onFinishInflate();
mNotificationIcons = (ViewGroup)findViewById(R.id.notificationIcons);
mStatusIcons = (ViewGroup)findViewById(R.id.statusIcons);
mDate = findViewById(R.id.date);
mBackground = new FixedSizeDrawable(mDate.getBackground());
mBackground.setFixedBounds(0, 0, 0, 0);
mDate.setBackgroundDrawable(mBackground);
}
onTouchEvent
//change by GJL
Intent intent = new Intent(Intent.ACTION_ICONKEY_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
intent.putExtra("keycode",   mResvKeyCode);
mService.sendIntent(intent);
if(key == RESV_KEY_BACK){
if(state == MotionEvent.ACTION_UP){
mBackIcon.setImageResource(com.android.internal.R.drawable.stat_sys_return);
}else if(state == MotionEvent.ACTION_DOWN){
mBackIcon.setImageResource(com.android.internal.R.drawable.stat_sys_return_pressed);
}
}else if(key == RESV_KEY_HOME){
if(state == MotionEvent.ACTION_UP){
mHomeIcon.setImageResource(com.android.internal.R.drawable.stat_sys_home);
}else if(state == MotionEvent.ACTION_DOWN){
mHomeIcon.setImageResource(com.android.internal.R.drawable.stat_sys_home_pressed);
}
}else if(key == RESV_KEY_MENU){
if(state == MotionEvent.ACTION_UP){
mMenuIcon.setImageResource(com.android.internal.R.drawable.stat_sys_menu);
}else if(state == MotionEvent.ACTION_DOWN){
mMenuIcon.setImageResource(com.android.internal.R.drawable.stat_sys_menu_pressed);
}
}

//  end
StatusBarService.java
void sendIntent(Intent intent)
{
mContext.sendBroadcast(intent);
}
StatusBarPolicy.java
BroadcastReceiver
if (action.equals(Intent.ACTION_ICONKEY_CHANGED)) {
Log.d(TAG, "Received ACTION_ICONKEY_CHANGED");
updateIconKeyAction(intent);
}

private final void updateIconKeyAction(Intent intent){
int     keycode = intent.getIntExtra("keycode", -1);

if(keycode != -1){
long now = SystemClock.uptimeMillis();

try {
KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keycode, 0);
KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, keycode, 0);
(IWindowManager.Stub
.asInterface(ServiceManager.getService("window")))
.injectKeyEvent(down, false);
(IWindowManager.Stub
.asInterface(ServiceManager.getService("window")))
.injectKeyEvent(up, false);
} catch (RemoteException e) {
Log.i("Input", "DeadOjbectException");
}

}
}
//end
filter.addAction(Intent.ACTION_ICONKEY_CHANGED);
//GLJ
//samwang
//samwang add for support volume up and down in UI
private int  checkVolumeKey(MotionEvent event){
int offset = 0;
int N = mStatusIcons.getChildCount();
int x = (int)event.getX();
offset = getViewOffset(mStatusIcons);
//Log.d("SAM_TEST", "N:" + N + " offset: " + offset + "x: " + x);
View v = mStatusIcons.getChildAt(N-4); // volume up
int l = v.getLeft() + offset;
int r = v.getRight() + offset;
//Log.v("SAM_TEST", "v_l: " + l + " v_r: " + r);
if (x >= l && x <= r){
//Log.v("SAM_TEST", "volume_up");
return 1;
}
View v2 = mStatusIcons.getChildAt(N-5);// volume down
int l2 = v2.getLeft() + offset;
int r2 = v2.getRight() + offset;
//Log.v("SAM_TEST", "v_l2: " + l2 + " v_r2:  " + r2);
if (x >= l2 && x <= r2){
//Log.v("SAM_TEST", "volume_down");
return -1;
}
return 0;
}

onTouchEvent
int check = checkVolumeKey(event);

if(mService.mExpanded==true || mService.mTracking==true){
if (event.getAction() != MotionEvent.ACTION_DOWN) {

mService.interceptTouchEvent(event);
}
return true;
}
if(event.getAction() != MotionEvent.ACTION_DOWN){
if(check != 0 && event.getAction() == MotionEvent.ACTION_UP){
mService.interceptTouchEvent(event, check);
return true;
StatusBarService.java
private AudioManager mAudioManager;
boolean interceptTouchEvent(MotionEvent event, int check){
boolean action  = false;
final StatusBarView view = mStatusBarView;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
action = false;
break;
case MotionEvent.ACTION_UP:
action = true;
break;
default:
action = false;
break;
}
if(action){
synchronized (this) {
if (mAudioManager == null) {
mAudioManager = (AudioManager) view.getContext().getSystemService(
Context.AUDIO_SERVICE);
}
}
mAudioManager.adjustStreamVolume(
AudioManager.STREAM_MUSIC,
check,
AudioManager.FLAG_SHOW_UI); //| AudioManager.FLAG_VIBRATE | AudioManager.FLAG_PLAY_SOUND);
}
return false;
}
StatusBarPolicy.java
// samwang add for support volume up and down
private IBinder mVolUpIcon;
private IBinder mVolDownIcon;
private IconData mVolumeDataUp;
private IconData mVolumeDataDown;
//samwang add for support volume up and down
private boolean mVolumeShow;
// samwang add for support volumn up and down in UI
mVolumeShow = true;
//samwang
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息