PopupWindow使用总结

前言

之前写过PopupWindow使用相关的知识,但是由于个人对PopupWindow知识的生疏以及开发使用的匆忙,对它使用的讲解比较零散,导致每次使用的时候都十分繁琐,于是今天抽空对PopupWindow的使用做以总结和封装,以方便PopupWindow的使用。

今天涉及的知识有:

  1. 封装类AppPopupWindow初步了解
  2. 如何快速建一个PopupWindow
  3. 设置PopupWindow显示大小
  4. PopupWindow中控件初始化
  5. 设置PopupWindow遮罩透明度
  6. 设置PopupWindow弹出动画
  7. 设置PopupWindow弹出位置
  8. AppPopupWindow其他方法
  9. AppPopupWindow在MainActivity中使用示例
  10. AppPopupWindow源码

一. 封装类AppPopupWindow初步了解

AppPopupWindow是我对PopupWindow进行一个简单封装形成的一个类。其中集成了PopupWindow创建所需要的基本方法,包括背景遮罩设置,显示尺寸,显示位置,出场动画等。当我们需要快速创建一个PopupWindow的时候,我们可以继承AppPopupWindow。

二. 如何快速建一个PopupWindow

基于AppPopupWindow特性,我们可以继承AppPopupWindow快速创建自己的PopupWindow。以TestPop为例,我们可以类似这样创建:

public class TestPop extends AppPopupWindow {

    private Button mButton;

    public TestPop(Context context){
        super(context);

    }

    @Override
    protected double[] getWindowSize() {
        return new double[]{0.5d,super.WRAP_CONTENT};
    }

    @Override
    protected int getLayoutId() {
        return R.layout.pop_test;
    }

    @Override
    protected void initView() {
        mButton= (Button) getView(R.id.btn1);
    }

    @Override
    protected void initData() {


    }

    @Override
    protected void setListener() {

    }


    public void setBtnConfirm(View.OnClickListener listener){
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onClick(v);
            }
        });
    }
}

三.设置PopupWindow显示大小

以上面TestPop为例,TestPop显示大小由以下方法决定:

    protected double[] getWindowSize() {
        return new double[]{d1,d2};
    }

其中d1和d2是double类型。

3.1 设置TestPop全屏显示

全屏设置可能存在兼容性问题,慎用,若不得已需要使用,需要多加测试。

public class TestPop extends AppPopupWindow {

    public TestPop(Context context){
        super(context);

    }

    @Override
    protected double[] getWindowSize() {
        return new double[]{super.MATCH_PARENT,super.MATCH_PARENT};
    }
    
    //其他方法省略
    //......

}

显示如下:


1.gif
3.2 设置TestPop大小自适应

若要设置TestPop的大小自适应,你可以这样:

public class TestPop extends AppPopupWindow {

    public TestPop(Context context){
        super(context);

    }

    @Override
    protected double[] getWindowSize() {
        return new double[]{super.WRAP_CONTENT,super.WRAP_CONTENT};
    }
    
    //其他方法省略
    //......

}

显示如下:


2.gif
3.3 设置TestPop按屏幕尺寸比例显示大小

若要让TestPop按屏幕比例显示,你可以这样:

public class TestPop extends AppPopupWindow {

    public TestPop(Context context){
        super(context);

    }

    @Override
    protected double[] getWindowSize() {
        return new double[]{0.3d,0.25d};
    }
    
    //其他方法省略
    //......

}

显示如下:


3.gif

四. PopupWindow中控件初始化

如上所述,在TestPop中,你可以这样像初始化控件:

    //声明控件
    private Button mButton;

    //初始化控件
    mButton= (Button) getView(R.id.btn1);

五.设置PopupWindow遮罩透明度

设置PopupWindow遮罩透明度方法如下:

    /**
     * 让popupwindown背景变暗
     *
     * @param bgAlpha 0f全黑,1.0f全透明
     * @return
     */
    setBackgroundAlpha(float bgAlpha)

例如,设置背景遮罩透明度为0.5f,可以这样:

popupWindow. setBackgroundAlpha(0.5f);

显示效果如下:


4.gif

六. 设置PopupWindow弹出动画

AppPopupWindow还支持弹出动画效果,具体动画效果参数有以下几种:

    //动画弹出效果
    public static final int ANIMATION_TOP_STYLE=1;//动画从控件上方弹出
    public static final int ANIMATION_LEFT_STYLE=2;//动画从控件左方弹出
    public static final int ANIMATION_BOTTOM_STYLE=3;//动画从控件下方弹出
    public static final int ANIMATION_RIGHT_STYLE=4;//动画从控件右方弹出
    public static final int ANIMATION_SCREEN_BOTTOM_STYLE=5;//动画从屏幕底部弹出

例如,我要设置popupWindow从控件上方弹出动画,可以这样设置:

//控件上面弹出
popupWindow.setAnimation(AppPopupWindow.ANIMATION_TOP_STYLE)

显示效果如下:


5.gif

其他动画效果调用雷同,这里就不啰嗦了。

七.设置PopupWindow弹出位置

AppPopupWindow支持popupWindow的弹出位置,其支持在控件上,下,左,右及屏幕底部弹出五种显示位置,调用方法如下:

    /**
     * 显示在控件正上方
     *
     * @param view
     *            依赖的控件
     * @param marginDp
     *            设置的间距(直接写数字即可,已经做过dp2px转换)
     */
    public void showAtLocationTop(View view, float marginDp)

    /**
     * 显示在控件正下方
     *
     * @param view
     *            依赖的控件
     * @param marginDp
     *            设置的间距(直接写数字即可,已经做过dp2px转换)
     */
    public void showAtLocationBottom(View view, float marginDp)

    /**
     * 显示在控件左方
     *
     * @param view 依赖的控件
     * @param marginDp 设置的间距(直接写数字即可,已经做过dp2px转换)
     */
    public void showAtLocationLeft(View view, float marginDp)

    /**
     * 显示在控件右方
     *
     * @param view 依赖的控件
     * @param marginDp 设置的间距(直接写数字即可,已经做过dp2px转换)
     */
    public void showAtLocationRight(View view, float marginDp)

    /**
     * 从屏幕底部弹出
     *
     * @param view
     */
    public void showAtScreenBottom(View view)

显示效果如下:


6.gif
7.gif
8.gif
9.gif
10.gif

八. AppPopupWindow其他方法

AppPopupWindow除了以上方法外,还有些常用的方法,如下:

/** PopupWindow背景设置 **/
setBackground(int color)

 /**点击pop外部是否消失,默认true消失**/
 setOuTouchCancel(boolean ouTouchCancel)

    /**
     * 获取焦点
     * 
     * @param focuse:设置为true时,可以让pop实现点击pop外部pop消失
     *               还可以让点击返回键时pop消失,一般设置true 
     * @return
     */
  setFocuse(boolean focuse)

  /**隐藏键盘**/
  hideKeyboard(View view)

九. AppPopupWindow在MainActivity中使用示例

下面给出AppPopupWindow在MainActivity中使用代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mBtn1;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
        setListener();
    }

    private void initData() {
        mBtn1 = findViewById(R.id.btn1);

    }

    private void setListener() {
        mBtn1.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:

                showPop();
                break;
            default:
                break;
        }
    }

    private void showPop(){
        TestPop testPop=new TestPop(MainActivity.this);

        testPop.setBackground(Color.RED)//设置背景
                .setFocuse(true)//点击返回键消失,一般设置为true
                .setOuTouchCancel(true);//点击pop外部消失,默认true消失
//                .setAnimation(AppPopupWindow.ANIMATION_TOP_STYLE)//控件上面弹出
//                .setAnimation(AppPopupWindow.ANIMATION_LEFT_STYLE)//控件左边弹出
//                .setAnimation(AppPopupWindow.ANIMATION_BOTTOM_STYLE)//控件下面弹出
//                .setAnimation(AppPopupWindow.ANIMATION_RIGHT_STYLE)//控件右边弹出
//                .setAnimation(AppPopupWindow.ANIMATION_SCREEN_BOTTOM_STYLE)//屏幕底部弹出
//                .setBackgroundAlpha(0.5f);//设置背景遮罩透明度(0f全黑,1.0f全透明)
        //点击事件
        testPop.setBtnConfirm(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ToastUtil.shortShow("lakkkkkkkkk");
            }
        });
        //监听关闭
        testPop.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                //遮罩还原
                testPop.setBackgroundAlpha(1.0f);
                //关闭键盘
                testPop.hideKeyboard(mBtn1);
            }
        });
        //显示
        if (!testPop.isShowing()) {

//            //控件正上方弹出pop
//            testPop.showAtLocationTop(mBtn1,5);
//            //控件左方弹出pop
//            testPop.showAtLocationLeft(mBtn1,5);
//            //控件正下方弹出pop
//            testPop.showAtLocationBottom(mBtn1, 5);
//            //控件右方弹出pop
//            testPop.showAtLocationRight(mBtn1,5);
            //屏幕正下方弹出pop
            testPop.showAtScreenBottom(mBtn1);
//            //弹出键盘
//            KeyboardUtil.openKeybord(pop.getEdtPCH(), mContext);
        }

    }

}

项目结构图


image.png

十. AppPopupWindow源码

AppPopupWindow功能如此之强大,必须得贴出AppPopupWindow代码:

还有 43% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
支付 ¥3.00 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容