Android--基于PopUpWindow的弹框Demo:PopUpDialog

PopUpDialog弹框

背景

Android中,很常见的功能就是弹框,而弹框又有许多不同的需求,比如视频全屏播放时屏幕四周弹出的控制栏、可以随意拖动的悬浮框、上拉/下拉列表等等。而这各类弹框,都可以用PopUpWindow来实现。接下来就分享一款使用indow实现的弹框Demo(PopUpDialog)。

用法

我们首先来看看该项目的效果:
在这里插入图片描述
上述图片中,共展示了四种弹框方式,分别为屏幕左右两端弹出及控件上下方弹出。

好,接下来我们来看看该框架的用法:
首先新建PopUpDialog对象:

    PopUpDialog popUpDialog1;
    PopUpDialog popUpDialog2;
    PopUpDialog popUpDialog3;
    PopUpDialog popUpDialog4;

接下来初始化PopUpDialog:

popUpDialog1 = new PopUpDialog(R.id.main_layout,
                R.layout.dialog_layout,
                button1,
                PopUpDialog.DIALOG_LEFT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                this);

该构造方法的参数释义如下:

   /**
     * 用于构造一个弹框(点击控件后显示在该视图正上方)
     *
     * @param rootViewId   activity的id,即activity跟节点的id。需要在xml中定义(R.id.xxx)
     * @param dialogViewId 弹框布局文件id(R.layout.xxx)
     * @param clickView    与弹框关联的控件(弹框将显示在该控件的上方),若不为上弹框(DIALOG_UP),则可传入null
     * @param mode         弹出模式,用于决定打开方式。
     * @param context      上下文
     */

该构造方法可以确认弹框的弹出方式及绑定控件的状态等(弹出时,绑定的控件处于selected状态)
我们也可以对弹框中的布局进行事件的绑定,此处不再赘述,有兴趣可以下载查看,注释很详细。

接下来,就可以显示我们的弹框了:

popUpDialog1.showPopUpWindow();

也可以关闭弹框:

popUpDialog2.dismiss();

后续规划

本Demo中的PopUpDialog构造函数中参数较多,后续会改为链式调用来创建Dialog,且完善弹框方式(如屏幕其它位置弹框、可拖动的弹框等)。

总结

这个Demo使用PopUpDialog实现,做得比较完善。PopUpDialog可以实现屏幕任意位置的弹框,也可以在显示的时候改变自身位置(例如:仿悬浮框效果)。这些例子在本Demo中没有展示,后续会完善。大家可以把本Demo作为练手项目,或在项目中使用。
项目地址:https://github.com/cjfu/PopUpDialog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用`QPopupWindow`类来实现弹出窗口,并使其跟随父窗口移动。首先,您需要创建一个`QPopupWindow`对象并将其设置为父窗口的子窗口。然后,您可以通过重写父窗口的`moveEvent`事件来更新弹出窗口的位置。 以下是一个示例代码片段,演示如何实现弹出窗口跟随父窗口移动: ```cpp #include <QMainWindow> #include <QPopupWindow> #include <QMoveEvent> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { // 创建弹出窗口 popupWindow = new QPopupWindow(this); popupWindow->setGeometry(100, 100, 200, 100); // 设置弹出窗口样式 // ... // 显示弹出窗口 popupWindow->show(); } protected: void moveEvent(QMoveEvent *event) override { // 获取父窗口的位置 QPoint parentPos = this->pos(); // 更新弹出窗口的位置 popupWindow->move(parentPos.x() + 50, parentPos.y() + 50); QMainWindow::moveEvent(event); } private: QPopupWindow *popupWindow; }; ``` 在这个示例中,`MainWindow`类继承自`QMainWindow`,并重写了`moveEvent`事件。在`moveEvent`事件中,我们获取父窗口的位置,并根据需要更新弹出窗口的位置(这里的示例是在父窗口的右下方偏移50个单位)。请根据您的实际需求修改位置的计算方式。 注意,`QPopupWindow`是一个自定义的子窗口类,您需要根据自己的需求进行实现。另外,记得在适当的时候销毁弹出窗口对象,避免内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值