`
vyphn
  • 浏览: 98231 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

自定义菜单

阅读更多
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="134dip" 
    android:id="@+id/launcher_menu"
    android:gravity="bottom"
    android:clickable="true"
	android:focusable="true"
    >
    <LinearLayout android:layout_width="fill_parent" 
    			  android:layout_height="67dip" 
    			  android:orientation="horizontal" 
    			  android:gravity="center" >
	    <LinearLayout android:id="@+id/layout_item_1" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_1" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
	    			  android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>
	    <LinearLayout android:id="@+id/layout_item_2" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_2" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
			          android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>
	    <LinearLayout android:id="@+id/layout_item_3" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_3" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
			          android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>        
	</LinearLayout>
	<LinearLayout android:layout_width="fill_parent" 
    			  android:layout_height="67dip" 
    			  android:orientation="horizontal" 
    			  android:gravity="center" >
	    <LinearLayout android:id="@+id/layout_item_4" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_4" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
			          android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>
	    <LinearLayout android:id="@+id/layout_item_5" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_5" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
			          android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>
	    <LinearLayout android:id="@+id/layout_item_6" 
	    			  android:layout_width="fill_parent" 
	    			  android:layout_height="67dip" 
	    			  android:layout_weight="1"
	    			  android:orientation="vertical" 
	    			  android:clickable="true"
	    			  android:focusable="true"
	    			  android:background="@drawable/launcher_menu_selector"
	    			  android:gravity="center" >
	    	<TextView android:id="@+id/menu_item_text_6" 
	    			  android:layout_width="wrap_content" 
	    			  android:layout_height="fill_parent"
	    			  android:textColor="#000000"
			          android:includeFontPadding="false" 
	    			  android:gravity="center" />
	    </LinearLayout>        
	</LinearLayout>
</LinearLayout>


@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
	if(keyCode == KeyEvent.KEYCODE_MENU){
		showLauncherMenu(keyCode, event);
		return true;
	}
	...
}

private PopupWindow menuWindow;
private void showLauncherMenu(int keyCode, KeyEvent event) {
	if(keyCode == KeyEvent.KEYCODE_MENU){
		int[] menuItemLayoutResId = {R.id.layout_item_1, R.id.layout_item_2, R.id.layout_item_3,
				R.id.layout_item_4, R.id.layout_item_5, R.id.layout_item_6};
		int[] menuItemTextViewResId = {R.id.menu_item_text_1, R.id.menu_item_text_2, R.id.menu_item_text_3,
				R.id.menu_item_text_4, R.id.menu_item_text_5, R.id.menu_item_text_6};
		if(null == menuWindow){
			final View layout = View.inflate(this, R.layout.launcher_menu, null);
			menuWindow = new PopupWindow(layout,LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
			for(int i=0; i<6; i++){
				...//处理菜单项点击事件,菜单图标、文字等
				//菜单显示后,焦点移动到了PopupWindow上的菜单项,需要在菜单项捕获Menu键以达到隐藏菜单的效果
				LinearLayout menuItemLayout = (LinearLayout)layout.findViewById(menuItemLayoutResId[i]);
				menuItemLayout.setOnKeyListener(new OnKeyListener(){
					@Override
					public boolean onKey(View v, int keyCode, KeyEvent event) {
						switch (keyCode) {
		                case KeyEvent.KEYCODE_MENU:
		                	if(event.getAction() == KeyEvent.ACTION_DOWN){
			                    if (menuWindow != null && menuWindow.isShowing()) {
			                    	menuWindow.dismiss();
			                    }
		                	}
		                    break;
		                }
						return false;
					}
				});
			}
			layout.setFocusable(true);
			layout.setFocusableInTouchMode(true);
			layout.setOnKeyListener(new OnKeyListener(){
				@Override
				public boolean onKey(View v, int keyCode, KeyEvent event) {
					switch (keyCode) {
	                case KeyEvent.KEYCODE_MENU:
	                	if(event.getAction() == KeyEvent.ACTION_DOWN){
		                    if (menuWindow != null && menuWindow.isShowing()) {
		                    	menuWindow.dismiss();
		                    }
	                	}
	                case KeyEvent.KEYCODE_DPAD_DOWN:
	                case KeyEvent.KEYCODE_DPAD_UP:
	                case KeyEvent.KEYCODE_DPAD_LEFT:
	                case KeyEvent.KEYCODE_DPAD_RIGHT:
	                	layout.findViewById(R.id.layout_item_1).requestFocus();
	                    break;
	                }
					return false;
				}
			});
		}
		if(!menuWindow.isShowing()){
			//处理菜单项"添加"是否可用
			mMenuAddInfo = mWorkspace.findAllVacantCellsFromModel();
			boolean isAddEnabled = mMenuAddInfo != null && mMenuAddInfo.valid;
			LinearLayout layout_item_add = (LinearLayout)menuWindow.getContentView().findViewById(R.id.layout_item_1);
			layout_item_add.requestFocus();
			layout_item_add.setClickable(isAddEnabled);
			layout_item_add.setBackgroundResource(isAddEnabled ? R.drawable.launcher_menu_selector : R.drawable.launcher_menu_disabled);
			Drawable icon = ThemeParser.loadMenuIcon(0);
			icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());
			icon.setAlpha(isAddEnabled ? 0xFF :(int)(0.2 * 0xFF));
			TextView text_item_add = (TextView)menuWindow.getContentView().findViewById(R.id.menu_item_text_1);
			text_item_add.setTextColor(isAddEnabled ? Color.parseColor("#000000") : R.color.gray);
			text_item_add.setCompoundDrawables(null, icon, null, null);
			boolean isOrientationLandscape = ScreenUtil.isOrientationLandscape(this);
			if(isOrientationLandscape){
				menuWindow.setHeight(ScreenUtil.dip2px(this, 67));
			}else{
				menuWindow.setHeight(ScreenUtil.dip2px(this, 134));
			}
			((LinearLayout)menuWindow.getContentView().findViewById(R.id.launcher_menu)).
				setBackgroundDrawable(ThemeParser.loadThemeMenuBackground(isOrientationLandscape));
			menuWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.transparent));
			
			menuWindow.setFocusable(true);
			menuWindow.setOutsideTouchable(true);
			//设置菜单显示隐藏的动画
			menuWindow.setAnimationStyle(R.style.PopupAnimation);
			menuWindow.showAtLocation(findViewById(R.id.drag_layer), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
			menuWindow.update();
		}else{
			menuWindow.dismiss();
		}
	}
}
分享到:
评论

相关推荐

    基于wxwidgets实现的自定义菜单

    在本文中,我们将深入探讨如何使用wxWidgets库来实现自定义菜单功能。wxWidgets是一个流行的跨平台C++库,它提供了丰富的GUI(图形用户界面)组件,使得开发者能够轻松地创建具有吸引力的桌面应用程序。 首先,我们...

    Delphi Edit右键系统菜单加自定义菜单项

    "Delphi Edit右键系统菜单加自定义菜单项" 是一个典型的增强用户界面交互的例子。在这个话题中,我们将深入探讨如何在Delphi中的TEdit控件上添加自定义的右键菜单,同时保持原有的系统菜单功能。 首先,我们要理解...

    MFC菜单重写可实现自定义菜单

    通过覆盖消息处理函数,我们可以实现自定义菜单样式、动态行为以及更加个性化的用户交互。结合辅助工具如QTOOLS,可以使这个过程更加高效和便捷。在实际项目中,我们应该充分利用这些功能,为用户提供更加美观、易用...

    VS Feature Pack学习之使用CMFCMenuBar自定义菜单栏

    现在很多应用程序的界面基本是用配置文件来规划界面的,在这个时候就得学会自定义菜单栏和工具栏之类的。 VS Feature Pack是为微软新推出的界面库(听说是买BCG的授权,然后对之进行改造的),其中的主要的界面类...

    微信自定义菜单php demo

    微信自定义菜单php demo,自定义代码

    微信开发学习总结(四)——自定义菜单——自定义菜单创建接口——项目源码

    微信开发学习总结(四)——自定义菜单——自定义菜单创建接口——项目源码; 博客:微信开发学习总结(四)——自定义菜单——自定义菜单创建接口; https://blog.csdn.net/qq_29914837/article/details/82928890

    创建微信自定义菜单java源码

    创建微信自定义菜单java源码,测试过了,可以用啊

    微信公众平台asp.net自定义菜单功能实现

    微信公众平台asp.net自定义菜单功能实现

    php创建微信自定义菜单的方法

    php代码,实现微信自定义菜单的创建

    基于jquery开发的仿微信自定义菜单的效果

    类似微信公众号中的自定义菜单的添加和信息的添加,可以增加和设置菜单的链接等信息

    pigcms 自定义菜单35错误补丁

    "pigcms 自定义菜单35错误补丁"是一个针对小猪CMS系统的特定问题的解决方案,这个问题主要涉及到自定义菜单功能。让我们深入探讨这个话题。 小猪CMS,全称PigCMS,是一款流行的开源PHP内容管理系统,它为用户提供了...

    仿手机QQ自定义菜单

    在Android开发中,自定义菜单是一项重要的技能,它允许开发者根据应用的需求创建独特且符合用户交互习惯的界面元素。这个“仿手机QQ自定义菜单”的实例是一个很好的学习资源,可以帮助我们理解如何模仿流行应用程序...

    jquery仿微信公众号自定义菜单功能

    此文件可以直接使用,采用Jquery和H5结合实现微信公众号自定义菜单功能

    [转载]微信自定义菜单源码(php)

    微信开发者自定义菜单源码。php源代码 已测无误,非常好用

    微信自定义菜单PHP代码

    自定义菜单的删除接口会一次性删除所有自定义菜单,请求地址是: https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=ACCESS_TOKEN。成功后返回数据是: {"errcode":0,"errmsg":"ok"} 之所以没有提供删除...

    QT样式(包含:系统托盘,独立标题栏,自定义菜单,窗口自由移动,样式效果)

    在QT样式中,我们可以看到多种功能的实现,如系统托盘、独立标题栏、自定义菜单、窗口自由移动以及各种样式效果。以下将详细讲解这些知识点。 1. **系统托盘**:系统托盘是应用程序在任务栏或通知区域中显示图标的...

    自定义菜单表

    自定义菜单表是数据库设计中的一个重要概念,尤其在企业级应用和网站开发中,它扮演着用户界面个性化和用户体验优化的角色。自定义菜单表通常用于存储用户或角色所能访问的菜单项及其排列顺序,以此来构建个性化的...

    jQuery右键自定义菜单.zip

    《jQuery右键自定义菜单详解》 在网页开发中,为用户提供便捷的交互体验是至关重要的,而右键菜单作为用户交互的一种常见形式,能够快速响应用户的操作需求。本文将详细解析“jQuery右键自定义菜单”这一JS特效,...

    Flex 3完整的右键自定义菜单Demo

    本Demo "Flex 3完整的右键自定义菜单" 正是为此目的而设计,它展示了如何在Flex 3环境中创建、屏蔽默认菜单并实现自定义的右键上下文菜单。 在Flex 3中,我们主要使用mx.controls.ContextMenu类来创建自定义的右键...

    jQuery仿微信公众号自定义菜单界面操作代码.zip

    代码片段: &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt; ...jQuery仿微信公众号自定义菜单界面操作代码&lt;...link rel="stylesheet" href="assets/css/bootstrap...自定义菜单&lt;/h3&gt;

Global site tag (gtag.js) - Google Analytics