Android开发技巧之我的菜单我做主(自定义菜单)

Android开发技巧之我的菜单我做主(自定义菜单),第1张

概述    AndroidSDK本身提供了一种默认创建菜单的机制。但通过这种机制创建的菜单虽然从功能上很完备,但在界面效果上实在是有点“土”。对于一个拥有绚丽界面的程序配上一个有点“土”的菜单,会使

     AndroID SDK本身提供了一种默认创建菜单的机制。但通过这种机制创建的菜单虽然从功能上很完备,但在界面效果上实在是有点“土”。对于一个拥有绚丽界面的程序配上一个有点“土”的菜单,会使用户感觉很怪,甚至会使绚丽的界面大打折扣。实际上,对于如此灵活和强大的AndroID系统,修改菜单的样式只是小菜一碟。为程序加入漂亮菜单的方法很多。在本节先介绍一种比较常用的方法,就是通过onKeyDown事件方法和PopupWindow实现自定义的菜单。至于通过这种技术能否设计出绚丽的菜单效果,那就要看我们的设 计、美学、心理学功底了。

     通过6.1.1节介绍的选项菜单可以知道。通过按手机的“Menu”键(是手机上的硬按键,不同手机“Menu”键所在的位置会不同),可以d出选项菜单,再按“Back”键,选项菜单会关闭。那么要想模拟选项菜单的d出和关闭效果,只需要监听这两个键的按下事件即可。并且在“Menu”键按下时使用PopupWindowd出一个窗口作为模拟的选项菜单。下面先来看看如图6.9所示的模拟选项菜单的效果。



从图6.9可以看出,在界面的下方显示了3个菜单项:“首页”、“我的”和“更多”。其中“我的”菜单项的文字和图像是左右水平排列,而另两个菜单项上的文字和图像是上下垂直排列。实际上,这种效果由一个普通的布局文件(menu_layout.xml)完成的,代码如下:
复制代码 代码如下:
<?xml version="1.0"enCoding="utf-8"?>
<linearLayoutxmlns:androID="http://schemas.androID.com/apk/res/androID"
androID:orIEntation="horizontal"androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:gravity="bottom">
<!-- 第一个菜单项:“首页” -->
<linearLayout androID:ID="@+ID/home"androID:orIEntation="vertical"
androID:layout_wIDth="fill_parent"androID:layout_height="wrap_content"
androID:background="@drawable/button_normal_translucent"
androID:layout_weight="1">
<ImageVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:src="@drawable/home"
androID:paddingtop="5dp" />
<TextVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:text="首页"
androID:gravity="center" />
</linearLayout>
<!-- 第二个菜单项:“我的” -->
<linearLayout androID:orIEntation="horizontal"
androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content"
androID:background="@drawable/button_normal"androID:layout_weight="1"
androID:gravity="center">
<ImageVIEw androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content" androID:src="@drawable/mine"/>
<TextVIEw androID:layout_wIDth="wrap_content"
androID:layout_height="wrap_content" androID:text="我的" />
</linearLayout>
<!-- 第三个菜单项
<linearLayout androID:orIEntation="vertical"
androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content" androID:background="@drawable/button_normal"
androID:layout_weight="1">
<ImageVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content"androID:src="@drawable/more"
androID:paddingtop="18dp" />
<TextVIEw androID:layout_wIDth="fill_parent"
androID:layout_height="wrap_content" androID:text="更多"
androID:gravity="center"androID:paddingtop="5dp"/>
</linearLayout>
</linearLayout>


在编写上面代码之前,别忘了准备几个相关的图像,例如,本例使用了5个图像。其中button_normal_translucent.png用于“首页”菜单项的背景(半透明效果),button_normal.png用于“我的”和“更多”菜单项的背景。home.png、mine.png和more.png分别用于这三个菜单项的图像。

下面来编写监听“menu”和“back”键按下动作的代码。按下“back”键要处理的任务有如下两个。

如果选项菜单已经d出,关闭选项菜单。如果选项菜单未d出,或已经被关闭,直接关闭当前的Activity,也就是调用finish方法。

为了区分上面两个任务,在程序中设置了一个int类型状态变量(state),当state为1时表示选项菜单已d出,state为2时表示选项菜单未d出。下面我们看一下完整的实现代码。
复制代码 代码如下:
package mobile.androID.ch06.custom.menu;
import androID.app.Activity;
import androID.os.Bundle;
import androID.vIEw.Gravity;
import androID.vIEw.KeyEvent;
import androID.vIEw.VIEw;
import androID.vIEw.VIEw.OnClickListener;
import androID.Widget.PopupWindow;
import androID.Widget.Toast;
public class Main extends Activity
{
privatePopupWindow pop;
privateVIEw layout;
private int state = 2; //状态变量,1:选项菜单已d出,2:选项菜单未d出
@OverrIDe
publicvoID onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentVIEw(R.layout.main);
}
@OverrIDe
publicboolean onKeyDown(int keyCode,KeyEvent event)
{
switch (keyCode)
{
case KeyEvent.KEYCODE_MENU: // 按下“menu”键的动作
// 选项菜单已d出,不再d出新的窗口
if (state == 1)
return false;
// 装载选项菜单布局文件
layout =getLayoutInflater().inflate(R.layout.menu_layout,null);
// 创建PopupWindow对象,并在指定位置d出用于显示菜单的窗口
pop = new PopupWindow(layout,getwindowManager()
.getDefaultdisplay().getWIDth(),getwindowManager()
.getDefaultdisplay().getHeight());
// 设置d出窗口的位置
pop.showAtLocation(layout,Gravity.BottOM,0);
VIEw home = layout.findVIEwByID(R.ID.home);
// 为“首页”菜单项添加单击事件
home.setonClickListener(new OnClickListener()
{
@OverrIDe
public voID onClick(VIEw vIEw)
{
Toast.makeText(Main.this,"单击定制菜单.",Toast.LENGTH_LONG).show();
// 单击“首页”菜单项后,关闭选项菜单
pop.dismiss();
// 重新设置状态变量
state = 2;
}
});
// d出选项菜单后,将状态变量设为1,表示选项菜单已d出
state = 1;
return false;
case KeyEvent.KEYCODE_BACK: // 按下“back”键的动作
if (state == 1)
{
// 如果选项菜单已d出,关闭它
pop.dismiss();
// 将状态变量设为选项菜单已关闭
state = 2;
}
else if (state == 2)
{
// 如果选项菜单还没有显示,或已经关闭,则直接关闭当前的Activity
finish();
}
return false;
}
// 除“menu”和“back”按下事件外,仍需调用Activity类的onKeyDown方法来响应其他键的按下事件
return super.onKeyDown(keyCode,event);
}
}

在编写上面代码时应注意如下几点。

对于选项菜单来说,一般单击某个菜单项后,会执行一些动作,并且选项菜单会自动关闭。为了模拟这一过程。为“首页”菜单项添加了一个单击事件。当单击“首页”菜单项时,会d出一个Toast提示信息,并且选项菜单会关闭。 当执行完按下“menu”或“back”键的动作后,onKeyDown方法应返回一个常量(false或true都可以),不能再调用super.onKeyDown方法,否则在执行完定制的菜单项动作后,又会执行系统的默认动作。例如,当按下“back”键后,关闭d出菜单后,连当前的Activity也一起关了。当然,如果是除了“menu”和“back”的其他键按下时还是需要调用Activity类的onKeyDown方法的(也就是super.onKeyDown方法),这样在程序中还可以响应其他的按键事件,否则程序除了“menu”和“back”键外,其他的键几乎都不好使了。showAtLocation方法用于控件d出窗口的位置。该方法的第1个参数是一个VIEw对象。实际上,showAtLocation方法内部只是需要调用VIEw.getwindowToken方法来获得一个IBinder对象。showAtLocation方法的第2个参数表示d出窗口的位置。本例中设置了d出窗口在屏幕底部显示。最后两个参数分别表示水平和垂直偏移量。本例都设为0,表示不发生偏移。因此,d出窗口会在屏幕的最底部显示,也就是显示选项菜单的位置。 您可能感兴趣的文章:安卓(Android)实现3DTouch效果Android左右滑出菜单实例分析android底部菜单栏实现原理与代码android popwindow实现左侧d出菜单层及PopupWindow主要方法介绍基于Android实现点击某个按钮让菜单选项从按钮周围指定位置d出Android ListView长按d出菜单二种实现方式示例Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)Android仿QQ空间底部菜单示例代码Android实现原生侧滑菜单的超简单方式Android实现类似3D Touch菜单功能@H_404_173@ 总结

以上是内存溢出为你收集整理的Android开发技巧之我的菜单我做主(自定义菜单)全部内容,希望文章能够帮你解决Android开发技巧之我的菜单我做主(自定义菜单)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1142907.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存