Android2.2版本中,如果你要修改菜单默认的背景颜色,网络上有许多的方法。在此就不说了。但是,如果要在2.2以上的版本修改菜单的样式,例如修改背景颜色,图片等,使用这些方法是没有任何作用的。因此自己写了一个自定义的菜单控件,可以自由定义菜单的样式,使得菜单的样式更加丰富。本文参考了这篇文章而写的:http://blog.csdn.net/hellogv/article/details/6168439。
程序运行效果:
MyMenu本身是一个PopupWindow,PopupWindow上放了一个GridView。给GridView配了一个MyMenuAdapter,于是有了菜单的样子。
1: 在工程的res文件夹下添加目录anim子目录,在anim文件夹中,新建了两个文件:
popup_enter.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%p" android:toYDelta="0" android:duration="500"/> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500"/> </set>popup_exit.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0" android:toYDelta="100%p" android:duration="1000"/> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="1000"/> </set>
2: 在工程的values文件夹下新建popup_animation.xml文件。
<?xml version="1.0" encoding="utf-8"?> <resources> <style name="PopupAnimation" parent="android:Animation"> <item name="android:windowEnterAnimation">@anim/popup_enter</item> <item name="android:windowExitAnimation">@anim/popup_exit</item> </style> </resources>
3: main.xml代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:id="@+id/linearLayout01"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
4: MyMenu的源码如下:
package com.haozi.demo.menu3.wiget; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.AdapterView.OnItemClickListener; /** * 我的菜单 * @author haozi * */ public class MyMenu extends PopupWindow { private GridView gvTitle; // 标题 private LinearLayout mLayout; // PopupWindow的布局 private MyMenuAdapter myMenuAdapter; // 自定义菜单的适配器 /** * 构造方法 * @param context 调用方的上下文 * @param titleClick 菜单点击事件 * @param myMenuAdapter 菜单适配器 * @param myMenuBackgroundColor 菜单背景颜色 * @param myMenuAnim 菜单需要的动画效果 */ public MyMenu(Context context, OnItemClickListener titleClick, int myMenuBackgroundColor, int myMenuAnim){ super(context); // 创建适配器 myMenuAdapter = new MyMenuAdapter(context, new String[]{"目录", "书签", "摘要", "设置"}, 16, Color.argb(255, 139, 106, 47), // 未选中字体颜色 Color.argb(255, 247, 246, 234), // 选中字体颜色 Color.argb(255, 247, 246, 234), // 未选中背景颜色 Color.argb(255, 139, 106, 47)); // 选中背景颜色 mLayout = new LinearLayout(context); mLayout.setOrientation(LinearLayout.VERTICAL); // 菜单选项栏 gvTitle = new GridView(context); gvTitle.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); // 设置列数 gvTitle.setNumColumns(myMenuAdapter.getCount()); // 设置宽度自适应 gvTitle.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); gvTitle.setVerticalSpacing(1); gvTitle.setHorizontalSpacing(1); gvTitle.setGravity(Gravity.CENTER); gvTitle.setOnItemClickListener(titleClick); // 选中的时候为透明色 gvTitle.setSelector(new ColorDrawable(Color.TRANSPARENT)); gvTitle.setAdapter(myMenuAdapter); // 把gvTitle放在layout上 this.mLayout.addView(gvTitle); // 设置菜单的特征 setContentView(this.mLayout); setWidth(LayoutParams.FILL_PARENT); setHeight(LayoutParams.WRAP_CONTENT); setBackgroundDrawable(new ColorDrawable(myMenuBackgroundColor)); setAnimationStyle(myMenuAnim); setFocusable(true); mLayout.setFocusableInTouchMode(true); mLayout.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_MENU && isShowing()){ dismiss(); return true; } return false; } }); } public void setTitleSelect(int index) { gvTitle.setSelection(index); this.myMenuAdapter.setFocus(index); } /** * 适配器 * @author haozi * */ class MyMenuAdapter extends BaseAdapter{ private Context context; private TextView[] tvTitles; private int fontUnSelColor; private int fontSelColor; private int bgUnSelColor; private int bgSelColor; /** * 设置 title * @param context 调用方的上下文 * @param titles 数据 * @param fontSize 字体大小 * @param fontUnSelColor 未选中字体颜色 * @param fontSelColor 选中字体颜色 * @param bgUnSelColor 未选中背景颜色 * @param bgSelColor 选中背景颜色 */ public MyMenuAdapter(Context context, String[] titles, int fontSize, int fontUnSelColor, int fontSelColor, int bgUnSelColor, int bgSelColor){ this.context = context; this.fontUnSelColor = fontUnSelColor; this.fontSelColor = fontSelColor; this.bgUnSelColor = bgUnSelColor; this.bgSelColor = bgSelColor; // 根据传递进来的titles创建menu上的textView。 tvTitles = new TextView[titles.length]; for(int i=0; i<titles.length; i++){ tvTitles[i] = new TextView(context); tvTitles[i].setText(titles[i]); tvTitles[i].setTextSize(fontSize); tvTitles[i].setTextColor(fontUnSelColor); tvTitles[i].setGravity(Gravity.CENTER); tvTitles[i].setPadding(10, 30, 10, 30); } } @Override public int getCount() { // TODO Auto-generated method stub return tvTitles.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return tvTitles[position]; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return tvTitles[position].getId(); } /** * 设置选中效果 * * @param index * * @project: * * @author haozi on 2012-3-5 */ public void setFocus(int index){ for(int i=0; i<tvTitles.length; i++){ if(i != index){// 如果未选中 this.tvTitles[i].setBackgroundColor(this.bgUnSelColor); this.tvTitles[i].setTextColor(this.fontUnSelColor); }else{// 如果选中 this.tvTitles[i].setBackgroundColor(this.bgSelColor); this.tvTitles[i].setTextColor(this.fontSelColor); } } } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = null; if(convertView == null){ v = tvTitles[position]; }else{ v = convertView; } return v; } } }
5: demo的Activity的源码如下,是在这里创建MyMenu。
/** * 入口Activity * @author haozi * */ public class _04MyMenuDemo3Activity extends Activity { private MyMenu myMenu; private int setTitle; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myMenu = new MyMenu(this, new TitleClickEvent(), Color.argb(255, 139, 106, 47), R.style.PopupAnimation); myMenu.update(); myMenu.setTitleSelect(0); } class TitleClickEvent implements OnItemClickListener{ @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { setTitle=arg2; myMenu.setTitleSelect(setTitle); } } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("menu"); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuOpened(int featureId, Menu menu) { if (myMenu != null) { if (myMenu.isShowing()) myMenu.dismiss(); else { myMenu.showAtLocation(findViewById(R.id.linearLayout01), Gravity.BOTTOM, 0, 0); } } return false;// 返回为true 则显示系统menu } }