好久没写了,看网上其他类似文章有点麻烦,我的方法较为简单,程序部分只改StatusBarService.java部分就可以了。

在StatusBarService.java

添加

import android.os.ServiceManager; import android.view.IWindowManager; import android.widget.ImageButton;

添加定义控件:

ImageButton homeButton;//对应 "@+id/Stat_Home_button" ImageButton volUpButton;//对应"@+id/Stat_vol_raise_button" ImageButton volDownButton;//对应 "@+id/Stat_vol_down_button" IWindowManager windowManager;

修改makeStatusBarView函数

private void makeStatusBarView(Context context)

private void makeStatusBarView(final Context context)

(至于为什么要加这个,不是很懂java,编译器提示要加就加上了-_-|||)

makeStatusBarView函数内部添加每个按钮的Listener来监听onClick

windowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); homeButton = (ImageButton)sb.findViewById(R.id.Stat_Home_button); homeButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ doKey(KeyEvent.KEYCODE_HOME); } }); volUpButton = (ImageButton)sb.findViewById(R.id.Stat_vol_raise_button); volUpButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ doKey(KeyEvent.KEYCODE_VOLUME_UP); } }); volDownButton = (ImageButton)sb.findViewById(R.id.Stat_vol_down_button); volDownButton.setOnClickListener(new View.OnClickListener(){ public void onClick(View v){ doKey(KeyEvent.KEYCODE_VOLUME_DOWN); } });

当按钮监听到onClick时就做相应的处理:

运行一个线程来把ACTION_DOWN和ACTION_UP事件injectKeyEvent,

看上去非常的简单,但是java在这里肯定做了不少事

private void doKey(final int eventCode){ new Thread(new Runnable() { public void run() { long now = SystemClock.uptimeMillis(); try { KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, eventCode, 0); KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, eventCode, 0); windowManager.injectKeyEvent(down, true); windowManager.injectKeyEvent(up, true); } catch (RemoteException e) { Slog.d("Input", "DeadOjbectException"); } } }).start(); }

最后在interceptTouchEvent()函数里面判断一下

....

if (SPEW) { Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" + mDisabled); if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { return false;}} int x1 = (int)event.getRawX(); int Button_l = homeButton.getLeft(); int Button_r = homeButton.getRight(); if(x1>Button_l && x1< Button_r) { Slog.d("pressed homeButton and intercepted"); return false; } Button_l = volUpButton.getLeft(); Button_r = volUpButton.getRight(); if(x1>Button_l && x1< Button_r) { Slog.d( "pressed volUpButton and intercepted"); return false; } Button_l = volDownButton.getLeft(); Button_r = volDownButton.getRight(); if(x1>Button_l && x1< Button_r) { Slog.d("pressed volDownButton and intercepted"); return false; } final int statusBarSize = mStatusBarView.getHeight(); final int hitSize = statusBarSize*2;

....

目的是消费掉对button的点击。

OK,就这样了

更多相关文章

  1. Android(安卓)Audio代码分析15 - testPlaybackHeadPositionAfter
  2. Android(安卓)Switch 修改文字颜色
  3. android全屏问题(隐藏虚拟按键)
  4. zygote服务启动
  5. Android(安卓)后台线程弹对话框导致程序崩溃(is not valid; is y
  6. android常用的工具类——将图形变成圆形
  7. [置顶] Android(安卓)多点触摸 multi-touch
  8. binder机制底层驱动浅析
  9. i.MX6 安装交叉编译器

随机推荐

  1. android LocationManager的使用
  2. Sqlite3常用简单指令
  3. Android Tasks、ActivityStack和Activity
  4. Kotlin 中Butterknife 和Android 中使用b
  5. Android解析ActivityManagerService(二)Act
  6. Activity的生命周期
  7. 13-6-3 android 自定义tabhost在底部与框
  8. [Android] 对ImageView设置属性scaleType
  9. android 抗锯齿效果
  10. Android轻量级存储源码分析