android 修改statusbar(一)添加home back menu键

2024-01-16 04:18

本文主要是介绍android 修改statusbar(一)添加home back menu键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


转自:   http://blog.csdn.net/dahuaishu2010_/article/details/7817733

由于完全改了status bar,建议先做几张png图片,加到



Frameworks/base/core/res/res/drawable
下。最好做一张背景图,替换 statusbar_background.png


另外我又加了几张icon,分别是home menu和back的正常和按下状态。


这些图片为:
frameworks\base\core\res\res\drawable\ic_menu_back_pressed.png
frameworks\base\core\res\res\drawable\ic_menu_home_pressed.png
frameworks\base\core\res\res\drawable\ic_menu_more_pressed.png
frameworks\base\core\res\res\drawable\ic_volume_down_pressed.png
frameworks\base\core\res\res\drawable\ic_volume_up_pressed.png
frameworks\base\core\res\res\drawable\ic_menu_back.png
frameworks\base\core\res\res\drawable\ic_menu_home.png
frameworks\base\core\res\res\drawable\ic_menu_more.png
frameworks\base\core\res\res\drawable\ic_volume_down.png
frameworks\base\core\res\res\drawable\ic_volume_up.png


修改步骤为:


一.修改xml界面
1.创建按钮
frameworks\base\core\res\res\drawable\btn_sbicon_back.xml
frameworks\base\core\res\res\drawable\btn_sbicon_home.xml
frameworks\base\core\res\res\drawable\btn_sbicon_menu.xml
frameworks\base\core\res\res\drawable\btn_sbicon_vol_down.xml
frameworks\base\core\res\res\drawable\btn_sbicon_vol_up.xml
基结构如下:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android ">
    <item android:state_pressed="true" android:drawable="@drawable/ic_menu_back_pressed" />
    <item android:state_pressed="false" android:drawable="@drawable/ic_menu_back" />
</selector>


2. 增加图标
更改整个status bar,我的方法是:
修改status bar的layerout文件:
Frameworks/base/core/res/res/layout/status_bar.xml
在原来的linearlayout中新增 image view


<?xml version="1.0" encoding="utf-8"?>
<com.android.server.status.StatusBarView xmlns:android="http://schemas.android.com/apk/res/android " 
    android:background="@drawable/statusbar_background"
    android:orientation="vertical"
    android:focusable="true"
    android:descendantFocusability="afterDescendants"
    >
    <LinearLayout android:id="@+id/keys"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:orientation="horizontal">
     <ImageView android:id="@+id/status_home" 
      android:layout_width="40dip" 
      android:layout_height="40dip"
      android:clickable="true"
      android:layout_gravity="top" 
      android:paddingTop="1dip" 
      android:paddingRight="1dip" 
      android:paddingLeft="1dip" 
      android:src="@drawable/btn_sbicon_home" /> 
     <ImageView android:id="@+id/status_back" 
      android:layout_width="40dip" 
      android:layout_height="40dip"
      android:clickable="true"
      android:layout_gravity="top" 
      android:paddingTop="1dip" 
      android:paddingRight="1dip" 
      android:paddingLeft="1dip" 
      android:src="@drawable/btn_sbicon_back" /> 
     <ImageView android:id="@+id/status_menu" 
      android:layout_width="40dip" 
      android:layout_height="40dip" 
      android:clickable="true"
      android:layout_gravity="top" 
      android:paddingTop="1dip" 
      android:paddingRight="1dip" 
      android:paddingLeft="1dip" 
      android:src="@drawable/btn_sbicon_menu" /> 
     <ImageView android:id="@+id/status_vol_down" 
      android:layout_width="40dip" 
      android:layout_height="40dip" 
      android:clickable="true"
      android:layout_gravity="top" 
      android:paddingTop="1dip" 
      android:paddingRight="1dip" 
      android:paddingLeft="1dip" 
      android:src="@drawable/btn_sbicon_vol_down" /> 
     <ImageView android:id="@+id/status_vol_up" 
      android:layout_width="40dip" 
      android:layout_height="40dip" 
      android:clickable="true"
      android:layout_gravity="top" 
      android:paddingTop="1dip" 
      android:paddingRight="1dip" 
      android:paddingLeft="1dip" 
      android:src="@drawable/btn_sbicon_vol_up" /> 
    </LinearLayout>
   ......
</com.android.server.status.StatusBarView>
这样做的好处就是简单。同时保证home、menu、back按钮,不受它本来的约束。这样status bar上即可看到这些按钮了。
图标的位置,可通过修改 paddingRight, paddingLeft 和paddingTop的值达到最佳视觉效果。


3. 修改status bar的高度。
既然要在status bar上增加那么几个按钮,当然是想要使用触摸操作的,android自带的status bar高度太小,不适用。对于7寸屏的话,50pixel的高度应该是差不多了。
修改高度很简单,修改frameworks/base/core/res/res/values/dimens.xml的status_bar_height属性
    <!-- Height of the status bar -->
    <dimen name="status_bar_height">50dip</dimen>


也可以更改状态栏Icon的大小,frameworks\base\core\res\res\layout\status_bar_icon.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android " 
    android:layout_width="25dp" 
    android:layout_height="25dp"    >


当然,如果相改title的高度,可以修改 Frameworks/base/core/res/res/values/themes.xml中的Window attributes的windowTitleSize值


编译运行一下:




~/donut$ source ./env.sh   
~/donut$ make –j8   
~/donut$ emulator –skin WVGA800 
~/donut$ source ./env.sh
~/donut$ make –j8
~/donut$ emulator –skin WVGA800


看状态栏是不是改变了?




二 为按钮添加模拟按键
修改frameworks\base\services\java\com\android\server\status\StatusBarView.java


1.添加各个图片按钮的引用,
android.widget.LinearLayout keysLayout;
android.widget.ImageView btnHome;
android.widget.ImageView btnBack;
android.widget.ImageView btnMenu;
android.widget.ImageView btnVolUp;
android.widget.ImageView btnVolDown;


2.修改onFinishInflate()函数,各个图片ID在上面的status_bar.xml中已经定义
@Override
protected void onFinishInflate() {
   ......    
    /* Begin : Added by TigerPan */
    keysLayout = (android.widget.LinearLayout)findViewById(R.id.keys);
    btnHome = (android.widget.ImageView)findViewById(R.id.status_home);
    btnBack = (android.widget.ImageView)findViewById(R.id.status_back);
    btnMenu = (android.widget.ImageView)findViewById(R.id.status_menu);
    btnVolUp = (android.widget.ImageView)findViewById(R.id.status_vol_up);
    btnVolDown = (android.widget.ImageView)findViewById(R.id.status_vol_down);
    btnHome.setOnClickListener(mKeysListener);
    btnBack.setOnClickListener(mKeysListener);
    btnMenu.setOnClickListener(mKeysListener);
    btnVolUp.setOnClickListener(mKeysListener);
    btnVolDown.setOnClickListener(mKeysListener);
    /* End : Added by TigerPan */
}


3.添加各个按钮的事件监听Listener
android.view.View.OnClickListener mKeysListener = new android.view.View.OnClickListener(){
public void onClick(View v) {
switch (v.getId()) {
case R.id.status_home:
   mKeysHandler.sendEmptyMessage(KEY_HOME);
   break;
case R.id.status_back:
   mKeysHandler.sendEmptyMessage(KEY_BACK);
   break;
case R.id.status_menu:
   mKeysHandler.sendEmptyMessage(KEY_MENU);
   break;
case R.id.status_vol_up:
   mKeysHandler.sendEmptyMessage(KEY_VOL_UP);
   break;
case R.id.status_vol_down:
   mKeysHandler.sendEmptyMessage(KEY_VOL_DOWN);
   break;
default:
   break;
}
}};


4.添加模拟按键处理
/* Begin : ADDED by TigerPan 20100831 */
private static final int KEY_HOME = 1000;
private static final int KEY_BACK = 1001;
private static final int KEY_MENU = 1002;
private static final int KEY_VOL_UP = 1003;
private static final int KEY_VOL_DOWN = 1004;
private Handler mKeysHandler = new Handler(){
public void handleMessage(Message msg) {
   switch (msg.what) {
case KEY_HOME:
   sendKey(KeyEvent.KEYCODE_HOME);
   break;
case KEY_BACK:
   sendKey(KeyEvent.KEYCODE_BACK);
   break;
case KEY_MENU:
   sendKey(KeyEvent.KEYCODE_MENU);
   break;
case KEY_VOL_UP:
   ((android.media.AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE))
   .adjustVolume(android.media.AudioManager.ADJUST_RAISE, android.media.AudioManager.STREAM_MUSIC);
   break;
case KEY_VOL_DOWN:
   ((android.media.AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE))
   .adjustVolume(android.media.AudioManager.ADJUST_LOWER, android.media.AudioManager.STREAM_MUSIC);
   break;
default:
   break;
}
}


private void sendKey(int keyCode) {
long now = SystemClock.uptimeMillis();
long n = System.currentTimeMillis();
Log.d("Tiger", "Intent.ACTION_SOFT_"+keyCode+"_PRESSED   0="+n);
try {
   KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0);
   KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0);
   Log.d("Tiger", "Intent.ACTION_SOFT_"+keyCode+"_PRESSED   1="+(System.currentTimeMillis()/*-n*/));
   IWindowManager wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
   Log.d("Tiger", "Intent.ACTION_SOFT_"+keyCode+"_PRESSED   2="+(System.currentTimeMillis()/*-n*/));
   wm.injectKeyEvent(down, false);
   Log.d("Tiger", "Intent.ACTION_SOFT_"+keyCode+"_PRESSED   3="+(System.currentTimeMillis()/*-n*/));
   wm.injectKeyEvent(up, false);
   Log.d("Tiger", "Intent.ACTION_SOFT_"+keyCode+"_PRESSED   4="+(System.currentTimeMillis()/*-n*/));
} catch (RemoteException e) {
   Log.i("Input", "DeadOjbectException");
}
}
};
/* End : ADDED by TigerPan 20100831 */


5.避免在按下这几个按钮时,触发下拉Notification视图,影响性能
修改onInterceptTouchEvent(MotionEvent event)函数
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
/* Begin : Modified by TigerPan */
if (keysLayout.getRight() < event.getX())
   return mService.interceptTouchEvent(event) ? true : super.onInterceptTouchEvent(event);
/*int parentLeft = mStatusIcons.getLeft();
android.util.Log.i("Tiger","....."+(event.getX() < (parentLeft + iconVolDown.getLeft()) || event.getX() > (parentLeft + iconHome.getRight())));
if(event.getX() < (parentLeft + iconVolDown.getLeft()) || event.getX() > (parentLeft + iconHome.getRight()))
   return mService.interceptTouchEvent(event) ? true : super.onInterceptTouchEvent(event);
*/
return false;
/* End : Modified by TigerPan */
}


这样,基本上就完成了。


编译一下


~/donut$ source ./env.sh   
~/donut$ make update-api   
~/donut$ make –j8   
~/donut$ emulator –skin WVGA800 
~/donut$ source ./env.sh
~/donut$ make update-api
~/donut$ make –j8
~/donut$ emulator –skin WVGA800

这篇关于android 修改statusbar(一)添加home back menu键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611309

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使