欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PopupWindow使用竟然如此简单!

程序员文章站 2022-03-11 15:41:56
...

PopupWindow使用竟然如此简单!

前言:在日常的开发中,经常会有弹框的操作。而实现弹框有两种选择,那就是PopupWindow或者Dialog,相信大家使用Dialog的更多一些,但是这里我推荐使用PopupWindow,因为AlertDialog不能指定显示位置,只能默认显示在屏幕最中间(当然也可以通过设置WindowManager参数来改变位置)。而PopupWindow是可以指定显示位置的,所以更加的灵活,是可以适应复杂的一些需求的。

这里直接给大家推荐几个库,里面都封装好了有关PopupWindow的一系列用法

1.RelativePopupWindow:代码简洁,支持各种位置的弹框。还能超出屏幕。用起来是这样的:

compile 'com.labo.kaji:relativepopupwindow:0.3.1'
popup.showOnAnchor(anchor, VerticalPosition.ABOVE, HorizontalPosition.CENTER);

2.EasyPopup 一个功能比较全的库,支持背景变暗,背景不可点击(6.0以上通用)等…而且可以链式调用哦。不过有个缺点:背景变暗效果只支持 4.2 以上的版本。用起来是这样的:

仓库依赖

allprojects {
    repositories {
    //...
    maven { url 'https://jitpack.io' }
    }
}

添加依赖:

dependencies {
    compile 'com.github.zyyoona7:EasyPopup:VERSION_CODE'
}

基本使用:

创建 EasyPopup 对象

可以调用 setXxx() 方法进行属性设置,最后调用 createPopup() 方法实现对PopupWindow的初始化。

private EasyPopup mCirclePop;
mCirclePop = EasyPopup.create()
        .setContentView(this, R.layout.layout_circle_comment)
        .setAnimationStyle(R.style.RightPopAnim)
    //是否允许点击PopupWindow之外的地方消失
        .setFocusAndOutsideEnable(true)
        .apply();
TextView tvZan=mCirclePop.findViewById(R.id.tv_zan);
TextView tvComment=mCirclePop.findViewById(R.id.tv_comment);
tvZan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ToastUtils.showShort("赞");
        mCirclePop.dismiss();
    }
});

tvComment.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ToastUtils.showShort("评论");
        mCirclePop.dismiss();
    }
});

显示

相对于 view 位置显示

/**
 * 相对anchor view显示,适用 宽高不为match_parent
 *
 * @param anchor
 * @param yGravity  垂直方向的对齐方式
 * @param xGravity  水平方向的对齐方式
 * @param x            水平方向的偏移
 * @param y            垂直方向的偏移
 */
mCirclePop.showAtAnchorView(view, YGravity.CENTER, XGravity.LEFT, 0, 0);

除了 showAtAnchorView() 方法,内部还保留了 showAsDropDown()、showAtLocation() 方法。

今天就简单介绍到这里,具体用法大家可以参见GitHub。