Android SystemUI源代码分析和修改

1.在导航栏中添加音量加减button

一些Android音量调节button。或者从保护实体按键的角度考虑,就须要在导航栏的虚拟按键中加入音量加减调节按键。

效果例如以下图所看到的:

实现步骤例如以下:

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

音量减的布局例如以下。这里先把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

版权声明:原创文章,转载请注明出处:http://blog.csdn.net/zhoumushui

时间: 2024-10-12 03:05:08

Android SystemUI源代码分析和修改的相关文章

Android init源代码分析(1)概要分析

功能概述 init进程是Android内核启动的第一个进程,其进程号(pid)为1,是Android系统所有进程的祖先,因此它肩负着系统启动的重要责任.Android的init源代码位于system/core/init/目录下,伴随Android系统多个版本的迭代,init源代码也几经重构. 目前Android4.4源代码中,init目录编译后生成如下Android系统的三个文件,分别是 /init /sbin/ueventd-->/init /sbin/watchdogd-->/init 其

Android init源代码分析(2)init.rc解析

本文描述init.rc脚本解析以及执行过程,读完本章后,读者应能 (1) 了解init.rc解析过程 (2) 定制init.rc init.rc介绍 init.rc是一个文本文件,可认为它是Android系统启动脚本.init.rc文件中定义了环境变量配置.系统进程启动,分区挂载,属性配置等诸多内容.init.rc具有特殊的语法.init源码目录下的readme.txt中详细的描述了init启动脚本的语法规则,是试图定制init.rc的开发者的必读资料. Android启动脚本包括一组文件,包括

Android 消息处理源代码分析(2)

Android 消息处理源代码分析(1)点击打开链接 继续接着分析剩下的类文件 Looper.java public final class Looper { final MessageQueue mQueue; //消息队列 final Thread mThread; //Looper联系的线程 public static void prepare() { prepare(true); } private static void prepare(boolean quitAllowed) { /

Android HandlerThread 源代码分析

HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又一次创建线程去运行该耗时任务.然而.这样就存在一个性能问题:多次创建和销毁线程是非常耗 系统资源的.为了解这样的问题,我们能够自己构建一个循环线程Looper Thread.当有耗时任务投放到该循环线程中时.线程运行耗 时任务,运行完之后循环线程处于等待状态,直到下一个新的耗时任务被投放进来.这样一

Android KLog源代码分析

Android KLog源代码分析 Android KLog源代码分析 代码结构 详细分析 BaseLog FileLog JsonLog XmlLog 核心文件KLogjava分析 遇到的问题 一直使用这个库.但没有细致研究.今天就来研究一下.该库的地址: KLog,在这里先感谢下作者.棒棒哒! 代码结构 整个代码的结构非常easy.例如以下: library klog BaseLog.java FileLog.java JsonLog.java XmlLog.java KLog.java K

【转】android SystemUI 流程分析

android4 SystemUI 流程分析 什么是SystemUI? 对于Phone来说SystemUI指的是:StatusBar(状态栏).NavigationBar(导航栏).而对于Tablet或者是TV来说SystemUI指的是:CombinedBar(包括了StatusBar和NavigationBar). 启动后Phone界面上的信号,蓝牙标志,Wifi标志等等这些状态显示标志都会在StatusBar上显示.当我们的设备开机后,首先需要给用户呈现的就是各种界面同时也包括了我们的Sys

[Android] Volley源代码分析(五岁以下儿童)Q \\ u0026一个

Volley源代码分析系列那里一段时间,告诉我,有许多私人留言,同时一些问题抛出.对于一些简单的问题,我们跳,这两天被连接到朋友@smali提出的问题.告诉我你不得不赞叹查看源代码时的详细程度,大家一块思考一下. Q:在写入文件头数据的时候为何不直接写入Int而是通过移位的方式来完毕? 我们来看一下相应的源代码: writeInt(os, CACHE_MAGIC); static void writeInt(OutputStream os, int n) throws IOException {

[Android]Fragment源代码分析(三) 事务

Fragment管理中,不得不谈到的就是它的事务管理,它的事务管理写的很的出彩.我们先引入一个简单经常使用的Fragment事务管理代码片段: FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); ft.add(R.id.fragmentContainer, fragment, "tag"); ft.addToBackStack("<span style="f

Android系统SettingsPrivider分析与修改方法

继上次分析Settings的文章Android 系统Settings概要之后,现要增加一些系统中没有的设置项,因上次只是猜测DatabaseHelper.java 在创建数据库时将defaults.xml中的配制存入了数据库中,因此现在来分析下SettingsPrivider源码(源码还是官方android-4.4_r1版本). 第一,主要分析DatabaseHelper.java文件: 1. 数据库文件为 settings.db  定义的表有人个 ,里面system , secure ,glo