Android懒人专用PopupWindow的工具类

前言:这段时间一直忙于学习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;
    }
}`
发布了22 篇原创文章 · 获赞 10 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 岁月 设计师: pinMode

分享到微信朋友圈

×

扫一扫,手机浏览