实例原代码:
http://download.csdn.net/detail/zhuimengandyue/5914779
一、效果图如下:
(1)正在冒出效果
(2)全部浮出效果
二、实现代码:
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.SimpleAdapter;
import android.widget.ViewFlipper;
import android.widget.AdapterView.OnItemClickListener;
public class FlipperMenuActivity extends Activity{
/*初始化布局中的组件*/
private PopupWindow popup;
private GridView mGridView;
private LinearLayout mLayout;
private ViewFlipper mViewFlipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.test_menu);
this.initPopupMenu();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
menu.add("menu");
return super.onCreateOptionsMenu(menu);
}
public void initPopupMenu() {
//创建动画
mViewFlipper = new ViewFlipper(this);
mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.menu_in));
mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.menu_out));
//创建布局
mLayout = new LinearLayout(FlipperMenuActivity.this);
mLayout.setOrientation(LinearLayout.VERTICAL);
//创建列表
mGridView = new GridView(FlipperMenuActivity.this);
mGridView.setBackgroundResource(R.drawable.toolbar_menu_bg);
mGridView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT));
mGridView.setSelector(R.drawable.toolbar_menu_item);//背景选择器
mGridView.setNumColumns(4);
mGridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
// mGridView.setVerticalSpacing(10);
//mGridView.setHorizontalSpacing(10);
//mGridView.setPadding(10, 10, 10, 10);
mGridView.setGravity(Gravity.CENTER);
String[] titleName = {"菜单一","菜单二","菜单三","退出"};
int[] images = {R.drawable.menu_refresh,R.drawable.menu_downmanager,
R.drawable.menu_help,R.drawable.menu_quit};
mGridView.setAdapter(this.getMenuAdapter(titleName, images));
mGridView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
switch(arg2) {
case 0:{
break;
}
case 1:break;
case 2:{
break;
}
case 3:{
new AlertDialog.Builder(FlipperMenuActivity.this).setTitle("提示")
.setIcon(android.R.drawable.ic_dialog_alert)
.setMessage("确定要退出吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//杀死进程
android.os.Process.killProcess(android.os.Process.myPid());
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 暂无实现的方法
}
}).show();
break;
}
default:break;
}
}
});
//添加如Layout中
mLayout.addView(mGridView);
mViewFlipper.addView(mLayout);
mViewFlipper.setFlipInterval(2000);
//创建popup
this.popup = new PopupWindow(mViewFlipper,LayoutParams.FILL_PARENT,
LayoutParams.WRAP_CONTENT);
// mGridView.setFocusable(true);
// popup.setOutsideTouchable(true);
popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_bg));
popup.setFocusable(true);//此项必须设置,否则点击无反应
}
private SimpleAdapter getMenuAdapter(String[] menuNameArray,
int[] imageResourceArray) {
ArrayList<HashMap<String, Object>> data
= new ArrayList<HashMap<String, Object>>();
for (int i = 0; i < menuNameArray.length; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("itemImage", imageResourceArray[i]);
map.put("itemText", menuNameArray[i]);
data.add(map);
}
SimpleAdapter simperAdapter = new SimpleAdapter(this, data,
R.layout.item_menu, new String[] { "itemImage", "itemText" },
new int[] { R.id.item_image, R.id.item_text });
return simperAdapter;
}
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
// TODO Auto-generated method stub
if(popup!=null) {
if(popup.isShowing()) {
//如果显示,则关闭
popup.dismiss();
}else {
popup.showAtLocation(findViewById(R.id.linear), Gravity.BOTTOM, 0, 0);
mViewFlipper.startFlipping();
/*
* 延时两秒结束动作
*/
new CountDownTimer(2000, 1000) {
@Override
public void onFinish() {
// TODO Auto-generated method stub
mViewFlipper.stopFlipping();
}
@Override
public void onTick(long millisUntilFinished) {
// 暂无实现的代码
}
}.start();
}
}
return false; //如果返回true则显示系统menu
}
}
testmenu.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="从底部浮出的menu菜单"
android:textSize="24sp"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#007612">
<TextView
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="从底部浮出的menu菜单"
android:textSize="24sp"/>
</LinearLayout>
item_menu.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout_bg"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:paddingTop="5dip"
android:paddingBottom="5dip">
<ImageView android:id="@+id/item_image"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
<TextView android:layout_below="@id/item_image" android:id="@+id/item_text"
android:layout_centerHorizontal="true" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:textColor="#FFFFFFFF"></TextView>
</RelativeLayout>
menu_in.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="2000" />
<alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="2000" />
</set>
menu_out.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="2000" />
<alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:duration="2000" />
</set>
三、注意项
popup.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_bg));
//此项必须设置,否则点击菜单周围,pop不消失.
popup.setFocusable(true);//此项必须设置,否则点击菜单项无反应
popup.showAtLocation(findViewById(R.id.linear), Gravity.BOTTOM, 0, 0);//设置pop显示在底部
mViewFlipper.startFlipping();//开始动画
mViewFlipper = new ViewFlipper(this);
mViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.menu_in));//创建flipper的切入动画
mViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.menu_out));
关于translate的fromYDelta的值比如"100%p" 等的介绍如下图所示: