有些Android设备没有实体的音量调节按钮,或者从保护实体按键的角度考虑,就需要在导航栏的虚拟按键中添加音量加减调节按键。
效果如下图所示:
实现过程如下:
1.首先在SystemUI中添加音量加减的资源文件,路径如下:
frameworks/base/packages/SystemUI/res/
将图片放入对应的drawable文件夹,包括音量+,和音量-,见上图。
2.修改导航栏的布局文件,路径:
frameworks/base/packages/SystemUI/res/
在对应的layout文件夹中找到navigation_bar.xml文件进行修改:
在返回键前面添加“音量减”,返回键的布局:
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
- android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_back"
- systemui:keyCode="4"
- android:layout_weight="0"
- systemui:glowBackground="@drawable/ic_sysbar_highlight"
- android:contentDescription="@string/accessibility_back"
- />
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/sub"
- android:src="@drawable/sub_normal"
- android:layout_width="@dimen/navigation_key_width"
- android:layout_height="match_parent"
- android:layout_weight="0"
- systemui:keyCode="302"
- systemui:glowBackground="@drawable/ic_sysbar_highlight"
- android:visibility="gone"/>
“音量加”添加到“最近应用”之后,最近应用的布局:
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
- android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_recent"
- android:layout_weight="0"
- systemui:glowBackground="@drawable/ic_sysbar_highlight"
- android:contentDescription="@string/accessibility_recent"
- />
音量加的布局:
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/add"
- android:src="@drawable/add_normal"
- android:layout_width="@dimen/navigation_key_width"
- android:layout_height="match_parent"
- android:layout_weight="0"
- systemui:keyCode="301"
- systemui:glowBackground="@drawable/ic_sysbar_highlight"
- android:visibility="gone"/>
3.接着修改代码逻辑,文件路径:
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
在private void prepareNavigationBarView() {……}函数中添加显示音量加减的代码:
- mNavigationBarView.getAddVolume().setVisibility(View.VISIBLE);
- mNavigationBarView.getSubVolume().setVisibility(View.VISIBLE);
对应的函数getAddVolume()和getAddVolume()要在
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
中实现:
- public View getAddVolume(){
- return mCurrentView.findViewById(R.id.add);
- }
- public View getSubVolume(){
- return mCurrentView.findViewById(R.id.sub);
- }
最后就是功能实现了,在
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
中添加监听函数:
- private View.OnTouchListener mAddVolumeOnTouchListener = new View.OnTouchListener() {
- public boolean onTouch(View v, MotionEvent ev) {
- final int action = ev.getAction();
- switch(action) {
- case MotionEvent.ACTION_DOWN:
- is_down = true;
- Adjust_Volume(true);
- maddHandler.postDelayed(maddRun, ADJUST_VOLUME_DELAY * 2);
- break;
- case MotionEvent.ACTION_MOVE:
- is_down = true;
- maddHandler.postDelayed(maddRun, ADJUST_VOLUME_DELAY * 2);
- // maddHandler.removeCallbacks(maddRun);
- break;
- case MotionEvent.ACTION_UP:
- is_down = false;
- maddHandler.removeCallbacks(maddRun);
- break;
- }
- return true;
- }
- };
- private View.OnTouchListener mSubVolumeOnTouchListener = new View.OnTouchListener() {
- public boolean onTouch(View v, MotionEvent ev) {
- final int action = ev.getAction();
- int x, y;
- //int mCode = ev.getAction();
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- is_down = true;
- Adjust_Volume(false);
- msubHandler.postDelayed(msubRun, ADJUST_VOLUME_DELAY * 2);
- break;
- case MotionEvent.ACTION_MOVE:
- is_down = true;
- msubHandler.postDelayed(msubRun, ADJUST_VOLUME_DELAY * 2);
- //msubHandler.removeCallbacks(msubRun);
- break;
- case MotionEvent.ACTION_UP:
- is_down = false;
- msubHandler.removeCallbacks(msubRun);
- break;
- }
- return true;
- }
- };
- public void Adjust_Volume(boolean opition){
- AudioManager audioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
- if (audioManager != null) {
- //
- // Adjust the volume in on key down since it is more
- // responsive to the user.
- //
- if(opition){
- audioManager.adjustSuggestedStreamVolume(
- AudioManager.ADJUST_RAISE,
- AudioManager.USE_DEFAULT_STREAM_TYPE,
- AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
- }else{
- audioManager.adjustSuggestedStreamVolume(
- AudioManager.ADJUST_LOWER,
- AudioManager.USE_DEFAULT_STREAM_TYPE,
- AudioManager.FLAG_SHOW_UI | AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
- }
- }
- }