Android SystemUI源代碼分析和修改

1.在導航欄中添加音量加減button
html

一些Android音量調節button。或者從保護實體按鍵的角度考慮,就需要在導航欄的虛擬按鍵中加入音量加減調節按鍵。java

效果例如如下圖所看到的:android


實現步驟例如如下:app

1.首先在SystemUI中加入音量加減的資源文件。路徑例如如下:函數

frameworks/base/packages/SystemUI/res/佈局

將圖片放入相應的drawable目錄,包含音量+。和音量-,見上圖。post


2.改動導航欄的佈局文件。路徑:ui

frameworks/base/packages/SystemUI/res/
spa

在相應的layout目錄中找到navigation_bar.xml文件進行改動:.net

在返回鍵前面加入「音量減」。返回鍵的佈局:

<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"
                />
音量減的佈局例如如下。這裏先把Visibility定義爲Gone,而後在代碼中控制是否顯示:

<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);
                    }
            }
    }




轉載請註明出處:周木水的CSDN博客 http://blog.csdn.net/zhoumushui

相關文章
相關標籤/搜索