在状态栏上添加Menu,Back,Home三个按钮的方法,在下文有良好的阐述。详见:

《在android的状态栏(statusbar)中增加menu,home和back快捷键的方法》http://blog.csdn.net/freshui/archive/2010/07/15/5738115.aspx

在使用过程中,存在两个问题:

  • HOME键在我的机器上无效
  • 连击按钮时,由于有时Intent未响应,导致弹起操作未响应直接诶被WindowsManager抛掉。这样就出现了虽然手已离开屏幕,但按钮出现高亮的状态。

1、对于第一个问题,我的方法是把home键单独进行处理,向launcher发送一个启动activity的Intent,这样可以直接回到桌面上。在原方法的基础上,对Home单独进行处理。

1 if (RESV_KEY_HOME = = mResvKeyCode)
2 {
3 Log . d(TAG, " HOME button Intent! " );
4 Intent intent = new Intent(Intent . ACTION_MAIN);
5 intent . setFlags(Intent . FLAG_ACTIVITY_NEW_TASK);
6 intent . addCategory(Intent . CATEGORY_HOME);
7 mService . sendIntent2(intent);
8 }
9 else
10 {
11 Log . d(TAG, " other two buttons Intent! " );
12 Intent intent = new Intent(Intent . ACTION_ICONKEY_CHANGED);
13 intent . addFlags(Intent . FLAG_RECEIVER_REGISTERED_ONLY);
14 intent . putExtra( " keycode " , mResvKeyCode);
15 mService . sendIntent(intent);
16 }

在StatusBarService.java中添加sendIntent2方法

1 void sendIntent2(Intent intent)
2 {
3 mContext . startActivity(intent);
4 }

2、第二个问题的修正思想是使用Animation逐帧动画来使得按钮从完成 正常态按下后-变化至高亮态-恢复正常态 这一周期。

a. 先在res/layout(与status_bar.xml同目录)中添加三个animation动画xml配置文件。

分别是

animation_home.xml:

1 < ?xml version = " 1.0 " encoding = " utf-8 " ? >
2 < animation-list xmlns:android = " http://schemas.android.com/apk/res/android "
3 android:oneshot = " true " >
4 < item
5 android:duration = " 80 "
6 android:drawable = " @drawable/stat_home " >
7 < /item >
8 < item
9 android:duration = " 80 "
10 android:drawable = " @drawable/stat_home_pressed " >
11 < /item >
12 < item
13 android:duration = " 80 "
14 android:drawable = " @drawable/stat_home " >
15 < /item >
16 < /animation-list >

animation_back.xml:

1 < ?xml version = " 1.0 " encoding = " utf-8 " ? >
2 < animation-list xmlns:android = " http://schemas.android.com/apk/res/android "
3 android:oneshot = " true " >
4 < item
5 android:duration = " 80 "
6 android:drawable = " @drawable/stat_back " >
7 < /item >
8 < item
9 android:duration = " 80 "
10 android:drawable = " @drawable/stat_back_pressed " >
11 < /item >
12 < item
13 android:duration = " 80 "
14 android:drawable = " @drawable/stat_back " >
15 < /item >
16 < /animation-list >
17
18
19

animation_menu.xml:

1 < ?xml version = " 1.0 " encoding = " utf-8 " ? >
2 < animation-list xmlns:android = " http://schemas.android.com/apk/res/android "
3 android:oneshot = " true " >
4 < item
5 android:duration = " 80 "
6 android:drawable = " @drawable/stat_menu " >
7 < /item >
8 < item
9 android:duration = " 80 "
10 android:drawable = " @drawable/stat_menu_pressed " >
11 < /item >
12 < item
13 android:duration = " 80 "
14 android:drawable = " @drawable/stat_menu " >
15 < /item >
16 < /animation-list >
17
18

这三个xml文件分别对应着 home back menu的动画过程

b . 在res/layout/status_bar.xml中修改Imageview的background指向上述三个xml配置文件:

1 < ?xml version = " 1.0 " encoding = " utf-8 " ? >
2 <!-- android:background="@drawable/status_bar_closed_default_background" -->
3 < com.android.server.status.StatusBarView xmlns:android = " http://schemas.android.com/apk/res/android "
4 android:background = " @drawable/statusbar_background "
5 android:orientation = " vertical "
6 android:focusable = " true "
7 android:descendantFocusability = " afterDescendants "
8 >
9
10 < LinearLayout android:id = " @+id/icons "
11 android:layout _width= " fill_parent "
12 android:layout _height= " fill_parent "
13 android:orientation = " horizontal " >
14 <!-- Ethan.zhao : Start Add home button on status_bar -->
15 < ImageView
16 android:id = " @+id/status_home "
17 android:layout _width= " wrap_content "
18 android:layout _height= " wrap_content "
19 android:layout _gravity= " top "
20 android:background = " @layout/animation_home "
21 / >
22 <!-- Ethan.zhao : Start Add home button on status_bar -->
23
24 < com.android.server.status.IconMerger android:id = " @+id/notificationIcons "
25 android:layout _width= " 0dip "
26 android:layout _weight= " 1 "
27 android:layout _height= " fill_parent "
28 android:layout _alignParentLeft= " true "
29 android:paddingLeft = " 6dip "
30 android:gravity = " center_vertical "
31 android:orientation = " horizontal " / >
32
33 < LinearLayout android:id = " @+id/statusIcons "
34 android:layout _width= " wrap_content "
35 android:layout _height= " fill_parent "
36 android:layout _alignParentRight= " true "
37 android:paddingRight = " 6dip "
38 android:gravity = " center_vertical "
39 android:orientation = " horizontal " / >
40 <!-- Ethan.zhao : Start Add menu/back button on status_bar -->
41 < ImageView
42 android:id = " @+id/status_menu "
43 android:layout _width= " wrap_content "
44 android:layout _height= " wrap_content "
45 android:layout _gravity= " top "
46 android:background = " @layout/animation_menu "
47 / >
48
49 < ImageView
50 android:id = " @+id/status_back "
51 android:layout _width= " wrap_content "
52 android:layout _height= " wrap_content "
53 android:layout _gravity= " top "
54 android:background = " @layout/animation_back "
55 / >
56 <!-- Ethan.zhao : End Add three button on status_bar -->
57 < /LinearLayout >
58 < LinearLayout android:id = " @+id/ticker "
59 android:layout _width= " fill_parent "
60 android:layout _height= " fill_parent "
61 android:paddingLeft = " 6dip "
62 android:animationCache = " false "
63 android:orientation = " horizontal " >
64 < ImageSwitcher android:id = " @+id/tickerIcon "
65 android:layout _width= " wrap_content "
66 android:layout _height= " fill_parent "
67 android:layout _marginRight= " 8dip "
68 >
69 < com.android.server.status.AnimatedImageView
70 android:layout _width= " 25dip "
71 android:layout _height= " 25dip "
72 / >
73 < com.android.server.status.AnimatedImageView
74 android:layout _width= " 25dip "
75 android:layout _height= " 25dip "
76 / >
77 < /ImageSwitcher >
78 < com.android.server.status.TickerView android:id = " @+id/tickerText "
79 android:layout _width= " 0dip "
80 android:layout _weight= " 1 "
81 android:layout _height= " wrap_content "
82 android:paddingTop = " 2dip "
83 android:paddingRight = " 10dip " >
84 < TextView
85 android:layout _width= " fill_parent "
86 android:layout _height= " wrap_content "
87 android:singleLine = " true "
88 android:textColor = " #ff000000 " / >
89 < TextView
90 android:layout _width= " fill_parent "
91 android:layout _height= " wrap_content "
92 android:singleLine = " true "
93 android:textColor = " #ff000000 " / >
94 < /com.android.server.status.TickerView >
95 < /LinearLayout >
96
97 < com.android.server.status.DateView android:id = " @+id/date "
98 android:layout _width= " wrap_content "
99 android:layout _height= " fill_parent "
100 android:singleLine = " true "
101 android:textSize = " 16sp "
102 android:textStyle = " bold "
103 android:gravity = " center_vertical|left "
104 android:paddingLeft = " 6px "
105 android:paddingRight = " 6px "
106 android:textColor = " ?android:attr/textColorPrimaryInverse "
107 android:background = " @drawable/statusbar_background "
108 / >
109 < /com.android.server.status.StatusBarView >

c . 修改StatusBarView.java文件,加入Animation相关代码:

添加三个AnimationDrawable:

1 AnimationDrawable mHomeAnimation;
2 AnimationDrawable mBackAnimation;
3 AnimationDrawable mMenuAnimation;

在onFinishInflate()方法中

1 mHomeAnimation = (AnimationDrawable) mHomeIcon . getBackground();
2 mBackAnimation = (AnimationDrawable) mBackIcon . getBackground();
3 mMenuAnimation = (AnimationDrawable) mMenuIcon . getBackground();

updateResvKeyIcon这个方法,改造成如下这样:

1 private int updateResvKeyIcon( int key)
2 {
3 if (key = = RESV_KEY_BACK)
4 {
5 mBackAnimation . run();
6 }
7 else if (key = = RESV_KEY_HOME)
8 {
9 mHomeAnimation . run();
10 }
11 else if (key = = RESV_KEY_MENU)
12 {
13 mMenuAnimation . run();
14 }
15 return 0 ;
16 }

d. 注释掉所有的updateResvKeyIcon方法,仅保留以下一个,并加上判断语句。

1 i f(mResvKeyState = = - 1 ) // remembered key state, no reserve
2 {
3 switch (getResvKeyArea(event)) {
4 case RESV_KEY_HOME :
5 case RESV_KEY_BACK :
6 case RESV_KEY_MENU :
7 {
8 mResvKeyState = event . getAction();
9 mResvKeyCode = getResvKeyArea(event);
10 i f (mResvKeyState = = MotionEvent . ACTION_DOWN) updateResvKeyIcon(mResvKeyCode); // 这句改成这样 附件下载如下:

http://download.csdn.net/source/2807668

更多相关文章

  1. Android(安卓)外观模式
  2. Android(安卓)Bluetooth 蓝牙开发资料大全【新】
  3. Android的SQLite使用实例
  4. Java集合框架——Android中的ArrayList源码分析
  5. Android之路之十七(重要组件之Service)
  6. Fedora17 64位 android "failed to create the SD card" 解决方
  7. Android的adapter总结和深入研究
  8. android获取控件宽和高
  9. Android事件和监听器详细的介绍

随机推荐

  1. android 对文件的操作模式
  2. android 利用TrafficStats类获取本应用的
  3. AndroidのCountDownTimer倒计时器
  4. Android:软件卸载的另一种方法adb uninst
  5. mtk android 配置mcp
  6. android:获取已经安装软件列表
  7. Android WIFI热点默认SSID的修改方法
  8. android 屏幕保持唤醒 不锁屏 android.pe
  9. Android之Menu菜单 onCreateOptionsMenu
  10. 将keras或tensorflow模型迁移到android端