教你如何创建类似QQ的android弹出菜单

来源:互联网 发布:mac自带的五笔输入法 编辑:程序博客网 时间:2024/05/01 03:24
大家可能看到 android 的自带的系统菜单比较难看,如图:
2313531o4zxzsz0i09uzs1.png 

很多应用都自己定义了系统菜单,
QQ游览器
2315274cv2cttn6tvi2bi2.png 
手机QQ
23152864yzyrn5949zy7z9.png 
我今天做的就是类似手机QQ的菜单,效果图如下:
231529ixickivmxvscpxp2.png 
这是我用PopupWindow重写一个菜单 ,popupwindow实现弹出菜单功能非常实用,在有布局中经常出现,给用户体验非常不错 ,主要是控制菜单的显示和消失(动画控制),另外对文字和图片(大小最好都一样,否则最后效果有点难看)分别做了适配,其中对文字的长度进行了处理。
下面不用多说,进行代码.需要提一下的是,屏蔽一下系统菜单,需要下面两步1. 需要创建至少一个系统菜单选项
231354e2y4768y48z22l6l.png 

2. 在onMenuOpened方法里显示自己的菜单视图,并返回FALSE
2313563yucge6usgtpa6c3.png 

?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
packagecn.mxgsa.menu;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Gravity;
importandroid.view.KeyEvent;
importandroid.view.Menu;
importandroid.view.View;
importandroid.view.ViewGroup.LayoutParams;
importandroid.widget.AdapterView;
importandroid.widget.AdapterView.OnItemClickListener;
importandroid.widget.GridView;
importandroid.widget.PopupWindow;
importandroid.widget.Toast;
publicclass MenuLikeQQActivity extendsActivity {
/**
* 定义popupwindow
*/
privatePopupWindow popup;
/**
* 定义适配器
*/
privateMenuAdapter menuAdapter;
//菜单项列表
privateList<MenuInfo> menulists;
//定义gridview
privateGridView menuGridView;
/** Called when the activity is first created. */
@Override
publicvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initPopuWindows();
}
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
returntrue;
}
/**
* 设置PopupWindows
*/
privatevoid initPopuWindows() {
//初始化gridview
menuGridView=(GridView)View.inflate(this, R.layout.gridview_menu, null);
//初始化PopupWindow,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT控制显示
popup = newPopupWindow(menuGridView, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
// 设置menu菜单背景
popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_background));
// menu菜单获得焦点 如果没有获得焦点menu菜单中的控件事件无法响应
popup.setFocusable(true);
//设置显示和隐藏的动画
popup.setAnimationStyle(R.style.menushow);
popup.update();
//设置触摸获取焦点
menuGridView.setFocusableInTouchMode(true);
//设置键盘事件,如果按下菜单键则隐藏菜单
menuGridView.setOnKeyListener(newandroid.view.View.OnKeyListener() {
publicboolean onKey(View v, intkeyCode, KeyEvent event) {
// TODO Auto-generated method stub
if((keyCode == KeyEvent.KEYCODE_MENU) && (popup.isShowing())) {
popup.dismiss();
returntrue;
}
returnfalse;
}
});
//添加菜单按钮事件
menuGridView.setOnItemClickListener(newOnItemClickListener() {
publicvoid onItemClick(AdapterView<?> arg0, View arg1, intarg2, longarg3) {
// TODO Auto-generated method stub
MenuInfo mInfo = menulists.get(arg2);
popup.dismiss();
if(mInfo.ishide) {
return;
}
switch(mInfo.menuId) {
caseMenuUtils.MENU_ADD_FRIEND:
Toast.makeText(MenuLikeQQActivity.this,"添加好友",1).show();
break;
caseMenuUtils.MENU_ADD_GROUP:
Toast.makeText(MenuLikeQQActivity.this,"添加分组",1).show();
break;
caseMenuUtils.MENU_EXIT:
Toast.makeText(MenuLikeQQActivity.this,"退出应用",1).show();
break;
caseMenuUtils.MENU_GROUP_ACCURATE:
break;
caseMenuUtils.MENU_GROUP_CATEGORY:
break;
caseMenuUtils.MENU_HELP:
Toast.makeText(MenuLikeQQActivity.this,"检查更新",1).show();
break;
caseMenuUtils.MENU_LOGOUT:
Toast.makeText(MenuLikeQQActivity.this,"切换用户",1).show();
break;
caseMenuUtils.MENU_SERCH_FRIEND:
Toast.makeText(MenuLikeQQActivity.this,"搜索好友",1).show();
break;
caseMenuUtils.MENU_SETTING:
Toast.makeText(MenuLikeQQActivity.this,"设置",1).show();
break;
}
}
});
}
@Override
publicboolean onMenuOpened(intfeatureId, Menu menu) {
// TODO Auto-generated method stub
if(popup != null) {
menulists = MenuUtils.getMenuList();
menuAdapter = newMenuAdapter(this, menulists);
menuGridView.setAdapter(menuAdapter);
popup.showAtLocation(this.findViewById(R.id.linearlayout), Gravity.BOTTOM, 0,0);
}
returnfalse;// 返回为true 则显示系统menu
}
@Override
publicboolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("menu");
returnsuper.onPrepareOptionsMenu(menu);
}
}


讲述的很简单,需要对大家有帮助下面附应用的源码.
 MenuLikeQQ.rar (149.85 KB, 下载次数: 879)