前言:这段时间一直忙于学习oracle,忽略了博客的编写,总感觉心若浮萍,无根飘摇,还是写篇博客稳一下心情吧。本篇博客适合刚入行工作的小菜鸟和不想重复编写PopupWindow弹出框的圆圆们。
用法:
首先还是看一下用法,只需要在使用的地方一句话链式编写就可以了。
①基本用法
PopWindowUtil.getInstance().makePopupWindow().showLocationWithAnimation()
你没有看错,就是这一句话就可以了,这句代码有返回值,返回值是一个PopupWindow对象,其中方法里面的参数请详细向下看。
②高级用法
PopWindowUtil.getInstance().setOnDissmissListener();
PopWindowUtil.getInstance().makePopupWindow().showLocationWithAnimation()
高级用法就是在实例化PopupWindow之前先设置监听,此监听是自定义的接口实现PopupWindow消失后的逻辑处理操作,后面有详细介绍。
详细实现:
如果你只想使用,那么下面就不用看了,但作为一个有追求的青年,知其然也要知其所以然。
① PopWindowUtil工具类单例模式:
作为工具类,这里我们让他变成单例模式,通过getInstance()
方法获取单实例。单例模式的具体实现有四种方式[详情请参考博文:http://blog.csdn.net/u012416928/article/details/43149343],此处采用了第四种写法,具体请看代码:
private static PopWindowUtil instance;
// 私有化构造方法,变成单例模式
private PopWindowUtil() {
}
// 对外提供一个该类的实例,考虑多线程问题,进行同步操作
public static PopWindowUtil getInstance() {
if (instance == null) {
synchronized (PopWindowUtil.class) {
if (instance == null) {
instance = new PopWindowUtil();
}
}
}
return instance;
}`
②创建PopupWindow:此处注释比较清楚,直接贴代码
` /**
* @param cx
* activity
* @param view
* 传入需要显示在什么控件下
* @param view1
* 传入内容的view
* @return
*/
public PopWindowUtil makePopupWindow(Context cx, View view, View view1, int color) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager wmManager=(WindowManager) cx.getSystemService(Context.WINDOW_SERVICE);
wmManager.getDefaultDisplay().getMetrics(dm);
int Hight = dm.heightPixels;
mPopupWindow = new PopupWindow(cx);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(color));
view1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// 设置PopupWindow的大小(宽度和高度)
mPopupWindow.setWidth(view.getWidth());
mPopupWindow.setHeight((Hight - view.getBottom()) * 2 / 3);
// 设置PopupWindow的内容view
mPopupWindow.setContentView(view1);
mPopupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
mPopupWindow.setTouchable(true); // 设置PopupWindow可触摸
mPopupWindow.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸
return instance;
}
③ 设置PopupWindow的显示动画及显示位置
`/**
*
* @param cx 此处必须为Activity的实例
* @param view 显示在该控件之下
* @param xOff 距离view的x轴偏移量
* @param yOff 距离view的y轴偏移量
* @param anim 弹出及消失动画
* @return
*/`
`public PopupWindow showLocationWithAnimation(final Context cx, View view,
int xOff, int yOff, int anim) {
// 弹出动画
mPopupWindow.setAnimationStyle(anim);
// 弹出PopupWindow时让后面的界面变暗
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =0.5f;
((Activity) cx).getWindow().setAttributes(parms);
int[] positon = new int[2];
view.getLocationOnScreen(positon);
// 弹窗的出现位置,在指定view之下
mPopupWindow.showAsDropDown(view, positon[0] + xOff, positon[1] + yOff);
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// PopupWindow消失后让后面的界面变亮
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =1.0f;
((Activity) cx).getWindow().setAttributes(parms);
//自定义接口进行弹出框消失时的操作
if (mListener != null) {
mListener.dissmiss();
}
}
});
return mPopupWindow;
}`
④ PopupWindow消失时的操作:自定义接口进行通讯
` private interface OnDissmissListener{
void dissmiss();
}
private OnDissmissListener mListener;
public void setOnDissmissListener(OnDissmissListener listener) {
mListener = listener;
}`
⑤ PopupWindow弹出及消失动画:
此处的动画就是在res文件夹下styles.xml文件中定义动画名称,然后在anim文件夹下定义对应的弹出和消失动画。下方以一张图代替。此处图片为截取别人的图,不做商业用途,仅供学习。
完整代码:
`public class PopWindowUtil {
private static PopWindowUtil instance;
private PopupWindow mPopupWindow;
// 私有化构造方法,变成单例模式
private PopWindowUtil() {
}
// 对外提供一个该类的实例,考虑多线程问题,进行同步操作
public static PopWindowUtil getInstance() {
if (instance == null) {
synchronized (PopWindowUtil.class) {
if (instance == null) {
instance = new PopWindowUtil();
}
}
}
return instance;
}
/**
* @param cx
* activity
* @param view
* 传入需要显示在什么控件下
* @param view1
* 传入内容的view
* @return
*/
public PopWindowUtil makePopupWindow(Context cx, View view, View view1, int color) {
DisplayMetrics dm = new DisplayMetrics();
WindowManager wmManager=(WindowManager) cx.getSystemService(Context.WINDOW_SERVICE);
wmManager.getDefaultDisplay().getMetrics(dm);
int Hight = dm.heightPixels;
mPopupWindow = new PopupWindow(cx);
mPopupWindow.setBackgroundDrawable(new ColorDrawable(color));
view1.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT));
// 设置PopupWindow的大小(宽度和高度)
mPopupWindow.setWidth(view.getWidth());
mPopupWindow.setHeight((Hight - view.getBottom()) * 2 / 3);
// 设置PopupWindow的内容view
mPopupWindow.setContentView(view1);
mPopupWindow.setFocusable(true); // 设置PopupWindow可获得焦点
mPopupWindow.setTouchable(true); // 设置PopupWindow可触摸
mPopupWindow.setOutsideTouchable(true); // 设置非PopupWindow区域可触摸
return instance;
}
/**
*
* @param cx 此处必须为Activity的实例
* @param view 显示在该控件之下
* @param xOff 距离view的x轴偏移量
* @param yOff 距离view的y轴偏移量
* @param anim 弹出及消失动画
* @return
*/
public PopupWindow showLocationWithAnimation(final Context cx, View view,
int xOff, int yOff, int anim) {
// 弹出动画
mPopupWindow.setAnimationStyle(anim);
// 弹出PopupWindow时让后面的界面变暗
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =0.5f;
((Activity) cx).getWindow().setAttributes(parms);
int[] positon = new int[2];
view.getLocationOnScreen(positon);
// 弹窗的出现位置,在指定view之下
mPopupWindow.showAsDropDown(view, positon[0] + xOff, positon[1] + yOff);
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
@Override
public void onDismiss() {
// PopupWindow消失后让后面的界面变亮
WindowManager.LayoutParams parms = ((Activity) cx).getWindow().getAttributes();
parms.alpha =1.0f;
((Activity) cx).getWindow().setAttributes(parms);
if (mListener != null) {
mListener.dissmiss();
}
}
});
return mPopupWindow;
}
private interface OnDissmissListener{
void dissmiss();
}
private OnDissmissListener mListener;
public void setOnDissmissListener(OnDissmissListener listener) {
mListener = listener;
}
}`