?
在android開發(fā)的過程中系統(tǒng)自帶的菜單往往滿足不了開發(fā)中的一些需求,比如說一排最多只能放置三個(gè)菜單,坐多只能放置6個(gè),再多的話就會(huì)折疊起來,如果我們想再一排顯示4個(gè)或5個(gè)菜單那么就要自己想辦法處理。
這里我用布局的隱藏并加上動(dòng)畫來模擬菜單的效果。
要點(diǎn):
1、隱藏和顯示菜單,我使用了一個(gè)線性布局把菜單封裝起來。
<?xml version=" 1.0 " encoding=" utf-8 "?> <LinearLayout xmlns:android=" http://schemas.android.com/apk/res/android " android:layout_alignParentBottom=" true " android:background=" @drawable/menubackground " android:layout_width=" fill_parent " android:layout_height=" 144px " android:orientation=" vertical " android:gravity=" center " android:visibility=" gone " android:id=" @+id/lines "> <LinearLayout android:orientation=" horizontal " android:gravity=" center " android:layout_width=" fill_parent " android:layout_height=" 72px " > <ImageButton android:layout_marginLeft=" 8dip " android:id=" @+id/menu_btn_index " android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_index_selector " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_news_selector " android:id=" @+id/menu_btn_news " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_lib_selector " android:id=" @+id/menu_btn_lib " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_add_selector " android:id=" @+id/menu_btn_add " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_set_selector " android:id=" @+id/menu_btn_set " /> </LinearLayout> <LinearLayout android:orientation=" horizontal " android:gravity=" center " android:layout_width=" fill_parent " android:layout_height=" 72px "> <ImageButton android:layout_marginLeft=" 8dip " android:id=" @+id/menu_btn_index " android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_index_selector " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_news_selector " android:id=" @+id/menu_btn_news " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_lib_selector " android:id=" @+id/menu_btn_lib " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_add_selector " android:id=" @+id/menu_btn_add " /> <ImageButton android:layout_width=" wrap_content " android:layout_height=" wrap_content " android:background=" @drawable/menu_quit_selector " android:id=" @+id/menu_btn_quit " /> </LinearLayout> </LinearLayout>
2、模擬菜單的效果,增加動(dòng)畫,布局顯示的時(shí)候增加一個(gè)漸漸底部生氣的效果,隱藏的時(shí)候增加一個(gè)緩緩下落的效果,顯示菜單動(dòng)畫文件:
<? xml version="1.0" encoding="utf-8" ?> < set xmlns : android = "http://schemas.android.com/apk/res/android" > < translate android : fromXDelta = "0" android : toXDelta = "0" android : fromYDelta = "00" android : toYDelta = "140" android : duration = "200" /> </ set >?
隱藏菜單動(dòng)畫文件:
?
<? xml version="1.0" encoding="utf-8" ?> < set xmlns : android = "http://schemas.android.com/apk/res/android" > < translate android : fromXDelta = "0" android : toXDelta = "0" android : fromYDelta = "140" android : toYDelta = "00" android : duration = "200" /> </ set >
動(dòng)畫調(diào)用:?
?
/** * 顯示菜單欄, 重新實(shí)現(xiàn)的Option menu. * */ private void showAppMenu() { if (menuShowAnimation == null ) { menuShowAnimation = AnimationUtils .loadAnimation(mContext, R.anim.menuhide); } myLayout.startAnimation(menuShowAnimation); myLayout.setVisibility(View.VISIBLE); } /** * 隱藏菜單欄, 重新實(shí)現(xiàn)的Option menu. * */ private void hideAppMenu() { myLayout.setVisibility(View.GONE); if (menuHideAnimation == null ) menuHideAnimation =AnimationUtils .loadAnimation(mContext, R.anim.menushow); myLayout.startAnimation(menuHideAnimation); }
3、控制菜單的隱藏和顯示,需要重寫三個(gè)方法public boolean onCreateOptionsMenu(Menu menu),public boolean dispatchKeyEvent(KeyEvent event) 和public boolean dispatchTouchEvent(MotionEvent event)
?
@Override public boolean onCreateOptionsMenu(Menu menu) { if (mCustomMenu== null ) mCustomMenu= new CustomMenu(CustomMenuActivity. this ,CustomMenuActivity. this ); mCustomMenu.CreateMenu(); return false ; } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (mCustomMenu!= null ) return mCustomMenu.dispatchKeyEvent(event, super .dispatchKeyEvent(event)); return super .dispatchKeyEvent(event); } @Override public boolean dispatchTouchEvent(MotionEvent event) { if (mCustomMenu!= null ) return mCustomMenu.dispatchTouchEvent(event, super .dispatchTouchEvent(event)); return super .dispatchTouchEvent(event); }
4、實(shí)現(xiàn)菜單點(diǎn)擊時(shí)候被點(diǎn)擊菜單狀態(tài)的般變化,這里我使用了selector來實(shí)現(xiàn),菜單我使用ImageButton將selector賦值給ImageButton 的background即可:一個(gè)菜單項(xiàng)
< ImageButton android : layout_marginLeft = "8dip" android : id = "@+id/menu_btn_index" android : layout_width = "wrap_content" android : layout_height = "wrap_content" android : background = "@drawable/menu_index_selector" />
menu_index_selector 文件內(nèi)容如下:
<? xml version="1.0" encoding="utf-8" ?> <!-- Copyright (C) 2009 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> < selector xmlns : android = "http://schemas.android.com/apk/res/android" > < item android : state_window_focused = "false" android : drawable = "@drawable/menu_index" /> < item android : state_pressed = "true" android : drawable = "@drawable/menu_index1" /> < item android : state_focused = "true" android : drawable = "@drawable/menu_index1" /> < item android : drawable = "@drawable/menu_index" /> </ selector >
?5、頁面的調(diào)用使用:<include>標(biāo)簽來進(jìn)行引用:
?
<? xml version="1.0" encoding="utf-8" ?> < RelativeLayout xmlns : android = "http://schemas.android.com/apk/res/android" android : orientation = "vertical" android : layout_width = "fill_parent" android : layout_height = "fill_parent" > < include layout = "@layout/menu_layout" /> </ RelativeLayout >
這樣的話一個(gè)模擬的自定義菜單就基本完成了,菜單控制完整代碼java類:
package
com.demo.utils;
import
android.app.Activity;
import
android.content.Context;
import
android.content.res.Resources;
import
android.view.KeyEvent;
import
android.view.MotionEvent;
import
android.view.View;
import
android.view.View.OnClickListener;
import
android.view.animation.Animation;
import
android.view.animation.AnimationUtils;
import
android.widget.ImageButton;
import
android.widget.LinearLayout;
import
com.demo.HelloWorld.R;
/**
* @author Administrator
* xsl xushilin@kingtoneinfo.com
* @version: 創(chuàng)建時(shí)間:2011-8-30 上午11:16:19
* 說 明:
* 修改歷史:
*/
public
class
CustomMenu {
private
LinearLayout myLayout;
private
Context mContext;
private
Activity mActivity;
private
Animation menuShowAnimation =
null
;
private
Animation menuHideAnimation =
null
;
private
Resources res;
public
int
screen_height;
private
ImageButton imgIndex,imgSet,imgNews,imgAdd,imgQuit,imgLib;
public
CustomMenu(Context context,Activity activity){
mContext=context;
mActivity=activity;
res = mContext.getResources();
screen_height = res.getDisplayMetrics().heightPixels;
myLayout=(LinearLayout)activity.findViewById(R.id.lines);
imgIndex=(ImageButton)activity.findViewById(R.id.menu_btn_index);
imgSet=(ImageButton)activity.findViewById(R.id.menu_btn_set);
imgNews=(ImageButton)activity.findViewById(R.id.menu_btn_news);
imgAdd=(ImageButton)activity.findViewById(R.id.menu_btn_add);
imgQuit=(ImageButton)activity.findViewById(R.id.menu_btn_quit);
imgLib=(ImageButton)activity.findViewById(R.id.menu_btn_lib);
//返回首頁
imgIndex.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
//設(shè)置
imgSet.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
//查詢
imgNews.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
//編輯
imgAdd.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
//退出系統(tǒng)
imgQuit.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
//素材庫
imgLib.setOnClickListener(
new
OnClickListener(){
public
void
onClick(View v) {
//TODO do somthing
}
});
}
public
void
CreateMenu(){
if
(myLayout.getVisibility()==View.GONE)
showAppMenu();
//myLayout.setVisibility(View.VISIBLE);
else
hideAppMenu();
//myLayout.setVisibility(View.GONE);
}
/**
* 顯示菜單欄, 重新實(shí)現(xiàn)的Option menu.
* */
private
void
showAppMenu() {
if
(menuShowAnimation ==
null
) {
menuShowAnimation = AnimationUtils
.loadAnimation(mContext, R.anim.menuhide);
}
myLayout.startAnimation(menuShowAnimation);
myLayout.setVisibility(View.VISIBLE);
}
/**
* 隱藏菜單欄, 重新實(shí)現(xiàn)的Option menu.
* */
private
void
hideAppMenu() {
myLayout.setVisibility(View.GONE);
if
(menuHideAnimation ==
null
)
menuHideAnimation =AnimationUtils
.loadAnimation(mContext, R.anim.menushow);
myLayout.startAnimation(menuHideAnimation);
}
public
boolean
dispatchTouchEvent(MotionEvent event,
boolean
b) {
if
(myLayout.getVisibility() == View.VISIBLE) {
int
y = (
int
) event.getRawY();
if
(y < screen_height - myLayout.getHeight()) {
hideAppMenu();
return
true
;
}
}
return
b;
}
public
boolean
dispatchKeyEvent(KeyEvent event,
boolean
b) {
int
act = event.getAction();
int
code = event.getKeyCode();
// app menu like option menu
if
(code == KeyEvent.KEYCODE_MENU){
if
(act == KeyEvent.ACTION_DOWN){
if
(myLayout.getVisibility() == View.VISIBLE) {
hideAppMenu();
}
else
{
showAppMenu();
}
return
true
;
}
}
else
if
(code == KeyEvent.KEYCODE_BACK){
if
(myLayout.getVisibility() == View.VISIBLE) {
hideAppMenu();
return
true
;
}
}
return
b;
}
}
activity調(diào)用菜單完整代碼:
package
com.demo.ui;
import
com.demo.HelloWorld.R;
import
com.demo.utils.CustomMenu;
import
android.app.Activity;
import
android.os.Bundle;
import
android.view.KeyEvent;
import
android.view.Menu;
import
android.view.MotionEvent;
/**
* @author XSL
* xsl xushilin@kingtoneinfo.com
* @version: 創(chuàng)建時(shí)間:2011-8-30 上午11:13:14
* 說 明:
* 修改歷史:
*/
public
class
CustomMenuActivity
extends
Activity {
private
CustomMenu mCustomMenu=
null
;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.custom_menu);
}
@Override
public
boolean
onCreateOptionsMenu(Menu menu) {
if
(mCustomMenu==
null
)
mCustomMenu=
new
CustomMenu(CustomMenuActivity.
this
,CustomMenuActivity.
this
);
mCustomMenu.CreateMenu();
return
false
;
}
@Override
public
boolean
dispatchKeyEvent(KeyEvent event) {
if
(mCustomMenu!=
null
)
return
mCustomMenu.dispatchKeyEvent(event,
super
.dispatchKeyEvent(event));
return
super
.dispatchKeyEvent(event);
}
@Override
public
boolean
dispatchTouchEvent(MotionEvent event) {
if
(mCustomMenu!=
null
)
return
mCustomMenu.dispatchTouchEvent(event,
super
.dispatchTouchEvent(event));
return
super
.dispatchTouchEvent(event);
}
}
實(shí)現(xiàn)的效果如下:
作者:
藍(lán)之風(fēng)
?
出處:
http://www.cnblogs.com/vaiyanzi/
?
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

