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

大家可能看到 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
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) 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值