- 浏览: 1362389 次
- 性别:
- 来自: 陕西.西安
文章分类
最新评论
-
dare_:
经过试验 设置之后反而更慢没有调用ensureCapacity ...
ensureCapacity()方法提高ArrayList的初始化速度 -
wangchao9053:
[flash=200,200][url][img][list] ...
Only the original thread that created a view hierarchy can touch its views的相关 -
cyb504:
考虑将rb文件代码隐藏:我先使用命令jrubyc将所有rb文件 ...
Ruby学习十 JRuby中调用java代码 -
4562xse3460:
大哥,您这个写反了,差点误导我,我觉得看着就不对。百度第一条就 ...
portrait表示纵向,landscape表示横向 -
yin138:
portrait是肖像画,即竖屏,landscape是风景画, ...
portrait表示纵向,landscape表示横向
需要说明的是:刚入手android没几天,对系统还不算很熟悉,这篇文章是基于前一篇转帖做的。只是觉得他的方法有些麻烦,而且改出来的效果也不 是我想要的。
由于完全改了 status bar ,建议先做几张 png 图片,加到
Frameworks/base/core/res/res/drawable
下。最好做一张背景图,替换 statusbar_background.png
另外我又加了几张 icon ,分别是 home menu 和 back 的正常和按下状态。
这些图片为:
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 bar 的 layerout 文件:
Frameworks/base/core/res/res/layout/status_bar.xml
在原来的 linearlayout 中新增三个 image view
- < LinearLayout android:id = "@+id/icons"
- android:layout_width = "fill_parent"
- android:layout_height = "fill_parent"
- android:orientation = "horizontal" >
- < ImageView android:id = "@+id/status_home"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:layout_gravity = "top"
- android:paddingTop = "6dip"
- android:paddingRight = "10dip"
- android:paddingLeft = "10dip"
- android:src = "@drawable/stat_home" />
- < com.android.server.status.IconMerger android:id = "@+id/notificationIcons"
- android:layout_width = "0dip"
- android:layout_weight = "1"
- android:layout_height = "fill_parent"
- android:layout_alignParentLeft = "true"
- android:paddingLeft = "6dip"
- android:gravity = "center_vertical"
- android:orientation = "horizontal" />
- < LinearLayout android:id = "@+id/statusIcons"
- android:layout_width = "wrap_content"
- android:layout_height = "fill_parent"
- android:layout_alignParentRight = "true"
- android:paddingRight = "6dip"
- android:gravity = "center_vertical"
- android:orientation = "horizontal" />
- < ImageView android:id = "@+id/status_menu"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:layout_gravity = "top"
- android:paddingTop = "6dip"
- android:paddingLeft = "10dip"
- android:paddingRight = "10dip"
- android:src = "@drawable/stat_menu" />
- < ImageView android:id = "@+id/status_back"
- android:layout_width = "wrap_content"
- android:layout_height = "wrap_content"
- android:layout_gravity = "top"
- android:paddingTop = "6dip"
- android:paddingRight = "10dip"
- android:paddingLeft = "10dip"
- android:src = "@drawable/stat_back" />
- /LinearLayout>
这样做的好处就是简单。同时保证 最右端是 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.xml 的 status_bar_height 属性
<!-- Height of the status bar -->
<dimen name="status_bar_height">50dip</dimen>
当然,如果相改 title 的高度,可以修改 Frameworks /base/core/res/res/values/themes.xml 中的 Window attributes 的 windowTitleSize 值,不过我觉得没必要,改了反倒不好看了 :)
编译运行一下:
, 看状态栏是不是改变了?
二 为按钮添加动态效果
添加动态效果,就是触摸按下 hilight ,松开或者移出后恢复的动作。这一块,我是通过修改 frameworks/base/services/java/com/android/server/status/StatusBarView.java 实现的。
1. 获取 statusbar 中新增加的 icon 的 handler 。
在类中新增加三个成员(这需要 import android.widget.ImageView; ):
同时增加三个常量,表示这些 icon 对应的键值 ( 这需要 import android.view.KeyEvent;)
在 onFinishInflate() 中,获得实际的对象:
这三个对象就是我们在 status_bar.xml 中添加的。
2. 添加触摸处理。
首先,应该判断是那个图标被按下,这个我们在 StatusBarView.Java 的 onTouchEvent 中来判断。
这里,我做了一个小的按键状态,已方便处理按下、弹起和移出的动作。
首先增加两个状态成员:
这样我的 onTouchEvent 就变成这样了:
里面用到的两个private方法简单实现如下:
同时,我不想再在按下这些icon的时候,触发下拉动作,我也改了 onInterceptTouchEvent函数:
再编译一下,看一下结果 : ) 是不是能动了?
三,添加相应事件
1. 添加新的intent
首先是新增一条 intent , 在 framework/base/core/java/android/content/intent.java 中增加
- @SdkConstant (SdkConstantType.BROADCAST_INTENT_ACTION)
- public static final String ACTION_ICONKEY_CHANGED = "android.intent.action.ICONKEY_CHANGED" ;
2. 发送intent
在StatusBarView.java的OnKeyEvent中,松开按键的分支else if(mResvKeyState == MotionEvent.ACTION_UP)操作中加入发送intent的动作:
这 个intent是只有注册的接收者才能接收。
这里,我们是通过StatusBarService来发送这个intent的。
在StatusBarService.java中新增一个方法:
- void sendIntent(Intent intent)
- {
- mContext.sendBroadcast(intent);
- }
3.接收并处理intent
这个就要修改StatusBarPolicy.java了
首先,在构造函数中加入Intent的filter,注册号这个intent的receiver。
filter.addAction(Intent.ACTION_ICONKEY_CHANGED);
然后再private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() 加入Intent的receiver动作;
- else if (action.equals(Intent.ACTION_ICONKEY_CHANGED)) {
- G, "Received ACTION_ICONKEY_CHANGED" );
- updateIconKeyAction(intent);
- }
方法updateIconKeyAction的定义如下:
- private final void updateIconKeyAction(Intent intent){
- int keycode = intent.getIntExtra( "keycode" , - 1 );
- if (keycode != - 1 ){
- long now = SystemClock.uptimeMillis();
- try {
- KeyEvent down = new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keycode, 0 );
- KeyEvent up = new KeyEvent(now, now, KeyEvent.ACTION_UP, keycode, 0 );
- (IWindowManager.Stub
- .asInterface(ServiceManager.getService("window" )))
- .injectKeyEvent(down, false );
- (IWindowManager.Stub
- .asInterface(ServiceManager.getService("window" )))
- .injectKeyEvent(up, false );
- } catch (RemoteException e) {
- Log.i("Input" , "DeadOjbectException" );
- }
- }
- }
这样,基本上就完成了。
编译一下, 由于新增了一个intent,因此要先make update-api,
- ~/donut$ source ./env.sh
- ~/donut$ make update-api
- ~/donut$ make –j8
- ~/donut$ emulator –skin WVGA800
另外,如果不是做phone,也可以在StatusBarPolicy.java中将所有phone相关的处理都删掉。
http://blog.csdn.net/freshui/archive/2010/07/15/5738115.aspx
发表评论
-
Android检查是否已经连接到网络
2012-05-14 15:40 1124http://blog.csdn.net/kerenigma/ ... -
Android Framework系列之IMF(二)
2011-06-02 10:09 2139InputConnection是IMF里面一个重要的接口,他是 ... -
Android Frameworks系列之IMF(一)
2011-06-02 10:03 1837http://www.pin5i.com/showtopic- ... -
Android线程优先级设置方法
2011-05-28 14:15 3484http://blog.sina.com.cn/s/blog_ ... -
如何连接android数据库
2011-05-27 15:18 2198http://zhidao.baidu.com/questio ... -
ensureCapacity()方法提高ArrayList的初始化速度
2011-05-27 14:33 11478http://www.gznc.edu.cn/yxsz/jjg ... -
java的isAlive 和 join
2011-05-27 13:38 1549join()用于停止当前线程而运行别的线程。 isAli ... -
Linux系统下.ko文件是什么文件?.so文件是什么文件?
2011-05-25 18:55 5378.so 文件是动态链接库文件,相当于 win下的 .dll ... -
使用Geocoder
2011-05-11 10:46 61117.6 使用Geocoder 地理编 ... -
Gallery学习总结--Cache缓存及数据处理流程
2011-05-09 14:21 2142http://hi.baidu.com/%D6%C7%B4%E ... -
关注的网站
2011-04-06 14:37 985http://blog.sina.com.cn/s/blog_ ... -
gallery3d源码学习总结(二)
2011-04-01 10:40 3483http://www.j2megame.com/htm ... -
gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-04-01 10:14 4818eoe·Android开发者门户 标题: gallery3d ... -
Android 启动过程详解(学习1)
2011-03-31 09:27 2187Android 启动过程详解 http://blog.csd ... -
Android中的WatchDog (2)
2011-03-31 09:11 1032http://wenku.baidu.com/view/09c ... -
Android平台WindowManager运用
2011-03-30 10:00 1781Android平台WindowManager运用 我们A ... -
JPEG Rotation and EXIF Orientation
2011-03-17 14:26 3877http://blog.csdn.net/daisyhd/ar ... -
Android 的动作、广播、类别等标识大全
2011-03-11 10:19 1250Android 的动作、广播、类别等标识大全 Stri ... -
浅析Android MediaProvider之二
2011-03-08 08:27 2619http://www.poemcode.net/2010/01 ... -
Task和Activity相关
2011-02-28 09:21 1513Task和Activity相关 这段时间在做一个项目,发 ...
相关推荐
在android的状态栏(statusbar)中增加menu,home和back快捷键的方法 framework里 修改的
打包文件中列出在Android 2.3系统的StatusBar上面添加,home,back等按钮所需要的资源文件及其一些代码Patch。
网上找了一些源码,都没说清楚,自己总结处理了一下,其实很简单,在不隐藏StatusBar的情况下,利用UIWindow视图覆盖状态栏StatusBar
gm-statusbar 状态栏透明工具类
android改变状态栏颜色,支持4.4以后系统,非常好用,支持eclipse导入
android开发讲解 在android的状态栏(statusbar)中增加menu,home和back快捷键
wpf 状态栏 右下角三角 statusbar
自定义状态栏(Status Bar),支持两种点击动作:1. 当用户点击状态栏时,状态栏会收缩,仅仅遮盖住状态栏右方的电池图标; 2. 当用户点击状态栏时,一个有详细信息的视图会下拉出现。 注意:请在Mac下解压使用
本篇文章主要介绍了Android实现状态栏(statusbar)渐变效果的示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
无系统权限应用使用悬浮窗起到禁用status功能bug
简单优雅地动态改变状态栏颜色,支持安卓4.4 。 Screenshots The left part is KITKAT, and right is LOLLIPOP. 左边是4.4,右边是5.0 。 Sample APK StatusBarColorCompat.apk Usage Just copy the ...
Android系统控制状态栏的下拉,禁止状态栏的下拉,通过反射获取系统的方法控制状态栏。
本文实例讲述了Android编程实现禁止StatusBar下拉的方法。分享给大家供大家参考,具体如下: Android中有许多隐藏的Service,StatusBarManager就是其中一个,在Context.java中可以看到: /** * Use with {@link #...
主要介绍了Android有效获取状态栏(StatusBar)高度的方法,涉及Android针对状态栏(StatusBar)属性操作的相关技巧,需要的朋友可以参考下
delphi中改变statusbar的背景色和字体颜色
matlab开发-statusbar。设置/获取GUI图形和Matlab桌面的状态栏
statusbar 设置 Matlab 桌面或图形的状态栏文本。 statusbar 接受 sprintf 函数接受的格式的参数,并返回状态栏句柄(如果可用)。 句法: statusbarHandle = statusbar(handle, text, sprintf_args...) statusbar...
android状态栏颜色主题设置,直接使用设置主题状态栏主题,或者修改状态栏颜色
qtstatusbar:Qt的StatusBar允许在Android和iOS上设置状态栏的颜色和主题