package com.future.dispatch.utils.EasePopup; import android.content.Context; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.PopupWindow; /** * 作者:Rance on 2016/11/29 10:47 * 邮箱:rance935@163.com */ public class PopupWindowFactory { private Context mContext; private PopupWindow mPop; /** * @param mContext 上下文 * @param view PopupWindow显示的布局文件 */ public PopupWindowFactory(Context mContext, View view){ this(mContext,view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } /** * @param mContext 上下文 * @param view PopupWindow显示的布局文件 * @param width PopupWindow的宽 * @param heigth PopupWindow的高 */ public PopupWindowFactory(Context mContext, View view, int width, int heigth){ init(mContext,view,width,heigth); } private void init(Context mContext, View view, int width, int heigth){ this.mContext = mContext; //下面这两个必须有!! view.setFocusable(true); view.setFocusableInTouchMode(true); // PopupWindow(布局,宽度,高度) mPop = new PopupWindow(view,width,heigth,true); mPop.setFocusable(true); // 重写onKeyListener,按返回键消失 view.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { mPop.dismiss(); return true; } return false; } }); //点击其他地方消失 view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mPop != null && mPop.isShowing()) { mPop.dismiss(); return true; } return false; }}); } public PopupWindow getPopupWindow(){ return mPop; } /** * 以触发弹出窗的view为基准,出现在view的内部上面,弹出的pop_view左上角正对view的左上角 * @param parent view * @param gravity 在view的什么位置 Gravity.CENTER、Gravity.TOP...... * @param x 与控件的x坐标距离 * @param y 与控件的y坐标距离 */ public void showAtLocation(View parent, int gravity, int x, int y){ if(mPop.isShowing()){ return ; } mPop.showAtLocation(parent, gravity, x, y); } /** * 以触发弹出窗的view为基准,出现在view的正下方,弹出的pop_view左上角正对view的左下角 * @param anchor view */ public void showAsDropDown(View anchor){ showAsDropDown(anchor,0,0); } /** * 以触发弹出窗的view为基准,出现在view的正下方,弹出的pop_view左上角正对view的左下角 * @param anchor view * @param xoff 与view的x坐标距离 * @param yoff 与view的y坐标距离 */ public void showAsDropDown(View anchor, int xoff, int yoff){ if(mPop.isShowing()){ return ; } mPop.showAsDropDown(anchor, xoff, yoff); } /** * 隐藏PopupWindow */ public void dismiss(){ if (mPop.isShowing()) { mPop.dismiss(); } } }