Android用PopupWindow实现从底部滑出选择菜单

jopen 10年前

在开发PopupWindow的弹出效果是必不可少的。许多应用的App都喜欢用到PopupWindow。如:新浪微博客户端、微信客户端、大众点评客户端等等。今天给大家

介绍微信客户端里用PopupWindow实现的一种从底部滑出选择菜单的效果。

本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计。弹出效果主要使用了translate和alpha样式实现,具体实例如下:

第一步:设计弹出窗口xml:

<?xml version="1.0" encoding="utf-8"?>  <RelativeLayout       xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:gravity="center_horizontal"      android:orientation="vertical"    >     <LinearLayout       android:id="@+id/pop_layout"      android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:gravity="center_horizontal"      android:orientation="vertical"      android:layout_alignParentBottom="true"       android:background="@drawable/btn_style_alert_dialog_background"       >                <Button          android:id="@+id/btn_take_photo"          android:layout_marginLeft="20dip"          android:layout_marginRight="20dip"          android:layout_marginTop="20dip"          android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:text="拍照"          android:background="@drawable/btn_style_alert_dialog_button"          android:textStyle="bold"           />         <Button          android:id="@+id/btn_pick_photo"          android:layout_marginLeft="20dip"          android:layout_marginRight="20dip"          android:layout_marginTop="5dip"           android:layout_width="fill_parent"          android:layout_height="wrap_content"          android:text="从相册选择"           android:background="@drawable/btn_style_alert_dialog_button"           android:textStyle="bold"           />         <Button          android:id="@+id/btn_cancel"         android:layout_marginLeft="20dip"         android:layout_marginRight="20dip"         android:layout_marginTop="15dip"         android:layout_marginBottom="15dip"         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="取消"         android:background="@drawable/btn_style_alert_dialog_cancel"         android:textColor="#ffffff"         android:textStyle="bold"                    />  </LinearLayout>  </RelativeLayout>

 第二步:创建SelectPicPopupWindow类继承PopupWindow:

import android.app.Activity;  import android.content.Context;  import android.graphics.drawable.ColorDrawable;  import android.view.LayoutInflater;  import android.view.MotionEvent;  import android.view.View;  import android.view.View.OnClickListener;  import android.view.View.OnTouchListener;  import android.view.ViewGroup.LayoutParams;  import android.widget.Button;  import android.widget.PopupWindow;     public class SelectPicPopupWindow extends PopupWindow {            private Button btn_take_photo, btn_pick_photo, btn_cancel;      private View mMenuView;         public SelectPicPopupWindow(Activity context,OnClickListener itemsOnClick) {          super(context);          LayoutInflater inflater = (LayoutInflater) context                  .getSystemService(Context.LAYOUT_INFLATER_SERVICE);          mMenuView = inflater.inflate(R.layout.alert_dialog, null);          btn_take_photo = (Button) mMenuView.findViewById(R.id.btn_take_photo);          btn_pick_photo = (Button) mMenuView.findViewById(R.id.btn_pick_photo);          btn_cancel = (Button) mMenuView.findViewById(R.id.btn_cancel);          //取消按钮          btn_cancel.setOnClickListener(new OnClickListener() {                 public void onClick(View v) {                  //销毁弹出框                  dismiss();              }          });          //设置按钮监听          btn_pick_photo.setOnClickListener(itemsOnClick);          btn_take_photo.setOnClickListener(itemsOnClick);          //设置SelectPicPopupWindow的View          this.setContentView(mMenuView);          //设置SelectPicPopupWindow弹出窗体的宽          this.setWidth(LayoutParams.FILL_PARENT);          //设置SelectPicPopupWindow弹出窗体的高          this.setHeight(LayoutParams.WRAP_CONTENT);          //设置SelectPicPopupWindow弹出窗体可点击          this.setFocusable(true);          //设置SelectPicPopupWindow弹出窗体动画效果          this.setAnimationStyle(R.style.AnimBottom);          //实例化一个ColorDrawable颜色为半透明          ColorDrawable dw = new ColorDrawable(0xb0000000);          //设置SelectPicPopupWindow弹出窗体的背景          this.setBackgroundDrawable(dw);          //mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框          mMenuView.setOnTouchListener(new OnTouchListener() {                             public boolean onTouch(View v, MotionEvent event) {                                     int height = mMenuView.findViewById(R.id.pop_layout).getTop();                  int y=(int) event.getY();                  if(event.getAction()==MotionEvent.ACTION_UP){                      if(y<height){                          dismiss();                      }                  }                                 return true;              }          });         }     }

第三步:编写MainActivity类实现测试:

import android.app.Activity;  import android.os.Bundle;  import android.view.Gravity;  import android.view.View;  import android.view.View.OnClickListener;  import android.widget.TextView;     public class MainActivity extends Activity {         //自定义的弹出框类      SelectPicPopupWindow menuWindow;             @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);          TextView tv = (TextView) this.findViewById(R.id.text);          //把文字控件添加监听,点击弹出自定义窗口          tv.setOnClickListener(new OnClickListener() {                         public void onClick(View v) {                  //实例化SelectPicPopupWindow                  menuWindow = new SelectPicPopupWindow(MainActivity.this, itemsOnClick);                  //显示窗口                  menuWindow.showAtLocation(MainActivity.this.findViewById(R.id.main), Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置              }          });      }             //为弹出窗口实现监听类      private OnClickListener  itemsOnClick = new OnClickListener(){             public void onClick(View v) {              menuWindow.dismiss();              switch (v.getId()) {              case R.id.btn_take_photo:                  break;              case R.id.btn_pick_photo:                                 break;              default:                  break;              }                                            }                 };         }

第四:运行效果如下: