在導航欄中新增音量加減button
阿新 • • 發佈:2019-01-05
一些Android音量調節button。或者從保護實體按鍵的角度考慮,就須要在導航欄的虛擬按鍵中加入音量加減調節按鍵。
效果例如以下圖所看到的:
實現步驟例如以下:
1.首先在SystemUI中加入音量加減的資原始檔。路徑例如以下:
frameworks/base/packages/SystemUI/res/
將圖片放入相應的drawable目錄,包含音量+。和音量-,見上圖。
2.改動導航欄的佈局檔案。路徑:
frameworks/base/packages/SystemUI/res/
在相應的layout目錄中找到navigation_bar.xml檔案進行改動:
在返回鍵前面加入“音量減”。返回鍵的佈局:
音量減的佈局例如以下。這裡先把Visibility定義為Gone,然後在程式碼中控制是否顯示:<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);
}
}
}