Android编程自定义菜单实现方法详解

本文实例讲述了Android编程自定义菜单实现方法。分享给大家供大家参考,具体如下:

在android开发的过程中系统自带的菜单往往满足不了开发中的一些需求,比如说一排最多只能放置三个菜单,坐多只能放置6个,再多的话就会折叠起来,如果我们想再一排显示4个或5个菜单那么就要自己想办法处理。

这里我用布局的隐藏并加上动画来模拟菜单的效果。

要点:

1、隐藏和显示菜单,我使用了一个线性布局把菜单封装起来。



   
 
  
  
    
 
 
 
 
  
  
  
 
 


2、模拟菜单的效果,增加动画,布局显示的时候增加一个渐渐底部生气的效果,隐藏的时候增加一个缓缓下落的效果,显示菜单动画文件:



  


隐藏菜单动画文件:



  


动画调用:

 /**
  * 显示菜单栏, 重新实现的Option menu.
  * */
 private void showAppMenu() {
   if (menuShowAnimation == null) {
     menuShowAnimation = AnimationUtils
         .loadAnimation(mContext, R.anim.menuhide);
   }
   myLayout.startAnimation(menuShowAnimation);
   myLayout.setVisibility(View.VISIBLE);
 }
 /**
  * 隐藏菜单栏, 重新实现的Option menu.
  * */
 private void hideAppMenu() {
   myLayout.setVisibility(View.GONE);
   if (menuHideAnimation == null)
     menuHideAnimation =AnimationUtils
         .loadAnimation(mContext, R.anim.menushow);
   myLayout.startAnimation(menuHideAnimation);
 }

3、控制菜单的隐藏和显示,需要重写三个方法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、实现菜单点击时候被点击菜单状态的般变化,这里我使用了selector来实现,菜单我使用ImageButton将selector赋值给ImageButton 的background即可:

一个菜单项



menu_index_selector 文件内容如下:




 
 
 
 


5、页面的调用使用:标签来进行引用:



 
 

这样的话一个模拟的自定义菜单就基本完成了,菜单控制完整代码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 [email protected]
 * @version: 创建时间: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
      }
    });
    //设置
    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
      }
    });
    //退出系统
    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);
  }
   /**
  * 显示菜单栏, 重新实现的Option menu.
  * */
 private void showAppMenu() {
   if (menuShowAnimation == null) {
     menuShowAnimation = AnimationUtils
         .loadAnimation(mContext, R.anim.menuhide);
   }
   myLayout.startAnimation(menuShowAnimation);
   myLayout.setVisibility(View.VISIBLE);
 }
 /**
  * 隐藏菜单栏, 重新实现的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调用菜单完整代码:

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 [email protected]
 * @version: 创建时间: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);
  }
}

实现的效果如下:

Android编程自定义菜单实现方法详解_第1张图片Android编程自定义菜单实现方法详解_第2张图片

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android操作json格式数据技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

你可能感兴趣的:(Android编程自定义菜单实现方法详解)