相关的文件位置

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 

更多相关文章

  1. Android捕获Home按键
  2. Android P SystemUI下拉时,状态栏和通知栏显示位置不一致。
  3. Android Studio中隐藏状态栏和标题栏的方法
  4. 修改frameworks源码去掉android的下拉通知状态栏
  5. android发现之旅之媒体按键(耳机按键播放暂停键等)处理过程
  6. Android中的状态选择器
  7. Android中状态栏的隐藏
  8. android 按键
  9. android:动态创建多个按钮 并给每个按键添加监听事件

随机推荐

  1. 如何安装新版Android Studio 3.0
  2. Android(安卓)TextSwitcher(文字交换器)
  3. Android(安卓)ffmpeg支持x264的编译脚本
  4. Android(安卓)在使用SmartRefreshLayout
  5. 用Gson和SharedPreferences轻松构建andro
  6. Android数据库ORMlite框架翻译系列
  7. Android的Audio系统
  8. 使用Android内置的Pull解析器解析XML文件
  9. Android(安卓)Studio中使用Gradle和Andro
  10. [置顶] Android模拟打电话应用程序实现分