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

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

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

    Android 消息处理源代码分析(1) 在Android中,通常被使用的消息队列的代码在文件夹\sources\android-22\android\os下,涉及到下面几个类文件 Handler.j ...

  2. Android HandlerThread 源代码分析

    HandlerThread 简单介绍: 我们知道Thread线程是一次性消费品,当Thread线程运行完一个耗时的任务之后.线程就会被自己主动销毁了.假设此时我又有一 个耗时任务须要运行,我们不得不又 ...

  3. Android HttpURLConnection源代码分析

    Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...

  4. Android KLog源代码分析

    Android KLog源代码分析 Android KLog源代码分析 代码结构 详细分析 BaseLog FileLog JsonLog XmlLog 核心文件KLogjava分析 遇到的问题 一直 ...

  5. android开发源代码分析--多个activity调用多个jni库的方法

    android开发源代码分析--多个activity调用多个jni库的方法 有时候,我们在开发android项目时会遇到须要调用多个native c/jni库文件,下面是本人以前实现过的方法,假设有知 ...

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

    Android 消息处理源代码分析(1)点击打开链接 继续接着分析剩下的类文件 Looper.java public final class Looper { final MessageQueue m ...

  7. Appium Android Bootstrap源代码分析之启动执行

    通过前面的两篇文章<Appium Android Bootstrap源代码分析之控件AndroidElement>和<Appium Android Bootstrap源代码分析之命令 ...

  8. 【转】android SystemUI 流程分析

    android4 SystemUI 流程分析 什么是SystemUI? 对于Phone来说SystemUI指的是:StatusBar(状态栏).NavigationBar(导航栏).而对于Tablet ...

  9. Android AsyncTask 源代码分析

    AsyncTask源代码分析 public abstract class AsyncTask<Params, Progress, Result> { //日志TAG private sta ...

随机推荐

  1. UVALive 3890 Most Distant Point from the Sea(凸包最大内接园)

    一个n个点的凸多边形,求多边形中离多边形边界最远的距离.实际上就是求凸包最大内接圆的半径. 利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的 ...

  2. 从PCI上读取数据 线程和定时器效率

    从PCI上读取数据 线程和定时器效率 线程: mythread=AfxBeginThread(StartContinuous,(LPVOID)1,THREAD_PRIORITY_NORMAL,0,CR ...

  3. NYOJ 47 河问题

    时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描写叙述 在漆黑的夜里,N位旅行者来到了一座狭窄并且没有护栏的桥边.假设不借助手电筒的话,大家是不管怎样也不敢过桥去的.不幸的是 ...

  4. windows phone (27) 基础Button

    原文:windows phone (27) 基础Button Button 在wp7中因其灵活性经常会用到,我们在ContentPanel中直接添加Button,button默认状态下是把整个grid ...

  5. 【安德鲁斯】基于脚本的数据库&quot;增量更新&quot;,如果不改变,每次更新java代码、!

    思维: 1.当然,它是基于SQLiteOpenHelper.onCreate(第一个呼叫建立).onUpdate(当所谓的升级计划) 2.用"脚本"(脚本制作详细方法问度娘)做数据 ...

  6. Sql Server函数全解<四>日期和时间函数

    原文:Sql Server函数全解<四>日期和时间函数   日期和时间函数主要用来处理日期和时间值,本篇主要介绍各种日期和时间函数的功能和用法,一般的日期函数除了使用date类型的参数外, ...

  7. Swing多线程编程(转)

    关键字: Swing,多线程,GUI,SwingWorker 摘要: 本文论述了怎样开发多线程的Swing程序,从而提高Swing程序的响应速度和性能.     近期,我将推出一系列研究Swing程序 ...

  8. Struts的ONGL

    1.什么是OGNL OGNL它是Object Graphic Navigation Language(对象图导航语言)缩写,    它是一个开源项目. Struts2框架使用OGNL作为默认的表达式语 ...

  9. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  10. PHP情人:p十几天来学习hp第一天

    我这里是暂时的 Apache web server 和 MY SQL 如WEB,在php-4.3.3下的环境做的程序.当然要简单的构建和訪问查看数据库 PHPMYADMIN 不可少.  以下简介一下P ...