在android的状态栏(statusbar)中增加menu,home和back快捷键的方法

需要说明的是:刚入手android没几天,对系统还不算很熟悉,这篇文章是基于前一篇转帖做的。只是觉得他的方法有些麻烦,而且改出来的效果也不是我想要的。

 

 

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

Frameworks/base/core/res/res/drawable

下。最好做一张背景图,替换 statusbar_background.png

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

这些图片为:

stat_home.png

stat_home_pressed.png

stat_back.png

stat_back_pressed.png

stat_menu.png

stat_menu_pressed.png

 

 

修改步骤为:

 

一.    修改xml界面

 

1. 增加图标

 

当然,更改整个status bar避免不要要对源码大刀修一下。我的该法是:

 修改status barlayerout文件:

Frameworks/base/core/res/res/layout/status_bar.xml

在原来的linearlayout中新增三个image view

 

  

这样做的好处就是简单。同时保证最右端是home按钮,最左端是back按钮,不受它本来的约束。这样status bar上即可看到这些按钮了。

       图标的位置,可通过修改 paddingRight paddingLeft paddingTop的值达到最佳视觉效果。

 

2. 修改status bar的高度。

 

既然要在status bar上增加那么几个按钮,当然是想要使用触摸操作的,android自带的status bar高度太小,不适用。对于7寸屏的话,50pixel的高度应该是差不多了。

修改高度很简单,如我转的shinning mm的博文。

修改frameworks/base/core/res/res/values/dimens.xmlstatus_bar_height属性

    <!-- Height of the status bar -->

    <dimen name="status_bar_height">50dip</dimen>

当然,如果相改title的高度,可以修改 Frameworks/base/core/res/res/values/themes.xml中的Window attributeswindowTitleSize值,不过我觉得没必要,改了反倒不好看了 :)

 

编译运行一下:

 

看状态栏是不是改变了?

 

 

 

为按钮添加动态效果

 

添加动态效果,就是触摸按下hilight,松开或者移出后恢复的动作。这一块,我是通过修改 frameworks/base/services/java/com/android/server/status/StatusBarView.java实现的。

 

1. 获取statusbar中新增加的iconhandler

 

在类中新增加三个成员(这需要import android.widget.ImageView;):

 

       

同时增加三个常量,表示这些icon对应的键值(这需要import android.view.KeyEvent;)

    

onFinishInflate()中,获得实际的对象:

 

 

这三个对象就是我们在status_bar.xml中添加的。

 

2. 添加触摸处理。

首先,应该判断是那个图标被按下,这个我们在StatusBarView.JavaonTouchEvent中来判断。

这里,我做了一个小的按键状态,已方便处理按下、弹起和移出的动作。

首先增加两个状态成员:

 

            

 

 

这样我的onTouchEvent就变成这样了:

 

里面用到的两个private方法简单实现如下:

 

同时,我不想再在按下这些icon的时候,触发下拉动作,我也改了onInterceptTouchEvent函数:

 

 

 

 

再编译一下,看一下结果 : 是不是能动了?

 

 

 

三,添加相应事件

 

1. 添加新的intent

首先是新增一条intent framework/base/core/java/android/content/intent.java中增加

 

 

 

 

  

 

 

2. 发送intent 

  在StatusBarView.java的OnKeyEvent中,松开按键的分支else if(mResvKeyState == MotionEvent.ACTION_UP)操作中加入发送intent的动作:

这个intent是只有注册的接收者才能接收。

 

这里,我们是通过StatusBarService来发送这个intent的。

在StatusBarService.java中新增一个方法:

 

3.接收并处理intent

这个就要修改StatusBarPolicy.java了

首先,在构造函数中加入Intent的filter,注册号这个intent的receiver。

  filter.addAction(Intent.ACTION_ICONKEY_CHANGED);
 

然后再private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() 加入Intent的receiver动作;

 

方法updateIconKeyAction的定义如下:

 

 

这样,基本上就完成了。

编译一下, 由于新增了一个intent,因此要先make update-api,

 

 

另外,如果不是做phone,也可以在StatusBarPolicy.java中将所有phone相关的处理都删掉。

 

 

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 59
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 59
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值