您的位置:首页 > 产品设计 > UI/UE

Android SystemUI在导航栏添加音量加减按钮

2015-04-15 16:06 127 查看
有些Android设备没有实体的音量调节按钮,或者从保护实体按键的角度考虑,就需要在导航栏的虚拟按键中添加音量加减调节按键。

效果如下图所示:



实现过程如下:

1.首先在SystemUI中添加音量加减的资源文件,路径如下:

frameworks/base/packages/SystemUI/res/

将图片放入对应的drawable文件夹,包括音量+,和音量-,见上图。

2.修改导航栏的布局文件,路径:

frameworks/base/packages/SystemUI/res/

在对应的layout文件夹中找到navigation_bar.xml文件进行修改:

在返回键前面添加“音量减”,返回键的布局:

[html] view
plaincopy

<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,然后在代码中控制是否显示:

[html] view
plaincopy

<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"/>    

“音量加”添加到“最近应用”之后,最近应用的布局:

[html] view
plaincopy

<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"  

                />  

音量加的布局:

[html] view
plaincopy

<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() {……}函数中添加显示音量加减的代码:

[java] view
plaincopy

mNavigationBarView.getAddVolume().setVisibility(View.VISIBLE);  

        mNavigationBarView.getSubVolume().setVisibility(View.VISIBLE);  

对应的函数getAddVolume()和getAddVolume()要在

frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java

中实现:

[java] view
plaincopy

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

中添加监听函数:

[java] view
plaincopy

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

                    }  

            }  

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: