在实际中,我们有时为了更炫的效果,而不会使用原生的Menu菜单弹出方式,其中,使用PopupWindow就是一种常用方式,下面用一个简单示例来演示,点击Menu菜单按钮,以动画的方式弹出一个PopupWindow窗口,代码如下:
Activity:
- package com.home.popupwindow;
- import android.app.Activity;
- import android.graphics.drawable.BitmapDrawable;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.Menu;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.WindowManager.LayoutParams;
- import android.widget.Button;
- import android.widget.PopupWindow;
- import android.widget.Toast;
- public class PopupWindowActivity extends Activity {
- // 声明PopupWindow对象
- private PopupWindow popupWindow;
- // Activity布局View
- private View rootView;
- // PopupWindow布局View
- private View contentView;
- private Button cancelBtn;
- private Button delBtn;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // 根据布局文件加载rootView组件
- rootView = getLayoutInflater().inflate(R.layout.main, null);
- setContentView(rootView);
- // 根据布局文件加载contentView组件
- contentView = getLayoutInflater().inflate(R.layout.popup_content, null);
- // 获得取消按钮组件
- cancelBtn = (Button) contentView
- .findViewById(R.id.popup_conent_btn_cancel);
- // 获得删除按钮组件
- delBtn = (Button) contentView.findViewById(R.id.popup_conent_btn_del);
- delBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- Toast.makeText(PopupWindowActivity.this, "执行具体删除操作!",
- Toast.LENGTH_LONG).show();
- }
- });
- cancelBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // 去掉PopupWindow
- popupWindow.dismiss();
- }
- });
- // 创建PopupWindow对象
- popupWindow = new PopupWindow(this);
- // 设置弹出窗口的内容
- popupWindow.setContentView(contentView);
- // 设置弹出窗口的宽度
- popupWindow.setWidth(LayoutParams.MATCH_PARENT);
- // 设置弹出窗口的高度
- popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
- // 在点击PopupWindow窗口外面时可以让窗口消失
- // popupWindow.setBackgroundDrawable(new BitmapDrawable());
- // 在点击PopupWindow窗口外面时让窗口不会消失
- popupWindow.setBackgroundDrawable(null);
- // 设置弹出窗口可以获取焦点
- popupWindow.setFocusable(true);
- // 设置动画效果
- popupWindow.setAnimationStyle(R.style.popup_anim_style);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- popupWindow.showAtLocation(rootView, Gravity.BOTTOM, 0, 0);
- return false;
- }
- }
PopupWindow的布局XML:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/popup_conent_btn_del"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="删除" />
- <Button
- android:id="@+id/popup_conent_btn_cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="取消" />
- </LinearLayout>
styles中加上style:
- <style name="popup_anim_style">
- <item name="android:windowEnterAnimation">@anim/popup_anim_in</item>
- <item name="android:windowExitAnimation">@anim/popup_anim_out</item>
- </style>
popup_anim_in动画:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="1500"
- android:fillAfter="true"
- android:fromXDelta="0"
- android:fromYDelta="200"
- android:toXDelta="0"
- android:toYDelta="0" />
- </set>
popup_anim_out动画:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="1500"
- android:fillAfter="true"
- android:fromXDelta="0"
- android:fromYDelta="0"
- android:toXDelta="0"
- android:toYDelta="200" />
- </set>