Android懒人专用PopupWindow的工具类

作者: 程序员指北 | 来源:发表于2017-06-15 15:02 被阅读380次

前言:这段时间一直忙于学习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;
    }


}

相关文章

网友评论

    本文标题:Android懒人专用PopupWindow的工具类

    本文链接:https://www.haomeiwen.com/subject/kotuqxtx.html