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

大家可能看到 android  的自带的系统菜单比较难看 , 如图 :
 

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

2. 在onMenuOpened方法里显示自己的菜单视图,并返回FALSE
教你如何创建类似QQ的android弹出菜单_第3张图片 

?
代码片段,双击复制
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
package cn.mxgsa.menu;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.PopupWindow;
import android.widget.Toast;
public class MenuLikeQQActivity extends Activity {
/**
* 定义popupwindow
*/
private PopupWindow popup;
/**
* 定义适配器
*/
private MenuAdapter menuAdapter;
//菜单项列表
private List<MenuInfo> menulists;
//定义gridview
private GridView menuGridView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
initPopuWindows();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
return true ;
}
/**
* 设置PopupWindows
*/
private void initPopuWindows() {
//初始化gridview
menuGridView=(GridView)View.inflate( this , R.layout.gridview_menu, null );
//初始化PopupWindow,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT控制显示
popup = new PopupWindow(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( new android.view.View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if ((keyCode == KeyEvent.KEYCODE_MENU) && (popup.isShowing())) {
popup.dismiss();
return true ;
}
return false ;
}
});
//添加菜单按钮事件
menuGridView.setOnItemClickListener( new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
MenuInfo mInfo = menulists.get(arg2);
popup.dismiss();
if (mInfo.ishide) {
return ;
}
switch (mInfo.menuId) {
case MenuUtils.MENU_ADD_FRIEND:
Toast.makeText(MenuLikeQQActivity. this , "添加好友" , 1 ).show();
break ;
case MenuUtils.MENU_ADD_GROUP:
Toast.makeText(MenuLikeQQActivity. this , "添加分组" , 1 ).show();
break ;
case MenuUtils.MENU_EXIT:
Toast.makeText(MenuLikeQQActivity. this , "退出应用" , 1 ).show();
break ;
case MenuUtils.MENU_GROUP_ACCURATE:
break ;
case MenuUtils.MENU_GROUP_CATEGORY:
break ;
case MenuUtils.MENU_HELP:
Toast.makeText(MenuLikeQQActivity. this , "检查更新" , 1 ).show();
break ;
case MenuUtils.MENU_LOGOUT:
Toast.makeText(MenuLikeQQActivity. this , "切换用户" , 1 ).show();
break ;
case MenuUtils.MENU_SERCH_FRIEND:
Toast.makeText(MenuLikeQQActivity. this , "搜索好友" , 1 ).show();
break ;
case MenuUtils.MENU_SETTING:
Toast.makeText(MenuLikeQQActivity. this , "设置" , 1 ).show();
break ;
}
}
});
}
@Override
public boolean onMenuOpened( int featureId, Menu menu) {
// TODO Auto-generated method stub
if (popup != null ) {
menulists = MenuUtils.getMenuList();
menuAdapter = new MenuAdapter( this , menulists);
menuGridView.setAdapter(menuAdapter);
popup.showAtLocation( this .findViewById(R.id.linearlayout), Gravity.BOTTOM, 0 , 0 );
}
return false ; // 返回为true 则显示系统menu
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add( "menu" );
return super .onPrepareOptionsMenu(menu);
}
}


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

你可能感兴趣的:(qq,menu)