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;
    }
}`
为了在Windows安装ADB工具,你可以按照以下步骤进行操作: 1. 首先,下载ADB工具包并解压缩到你自定义的安装目录。你可以选择将其解压缩到任何你喜欢的位置。 2. 打开运行窗口,可以通过按下Win+R键来快速打开。在运行窗口中输入"sysdm.cpl"并按下回车键。 3. 在系统属性窗口中,选择"高级"选项卡,然后点击"环境变量"按钮。 4. 在环境变量窗口中,选择"系统变量"部分,并找到名为"Path"的变量。点击"编辑"按钮。 5. 在编辑环境变量窗口中,点击"新建"按钮,并将ADB工具的安装路径添加到新建的路径中。确保路径正确无误后,点击"确定"按钮。 6. 返回到桌面,打开命令提示符窗口。你可以通过按下Win+R键,然后输入"cmd"并按下回车键来快速打开命令提示符窗口。 7. 在命令提示符窗口中,输入"adb version"命令来验证ADB工具是否成功安装。如果显示版本信息,则表示安装成功。 这样,你就成功在Windows安装ADB工具。你可以使用ADB工具来执行各种操作,如枚举设备、进入/退出ADB终端、文件传输、运行命令、查看系统日志等。具体的操作方法可以参考ADB工具的官方文档或其他相关教程。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [windows环境安装adb驱动](https://blog.csdn.net/zx54633089/article/details/128533343)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Windows安装使用ADB简单易懂教程](https://blog.csdn.net/m0_37777700/article/details/129836351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值