PopWindow完全解析

1、含义

Popwindow就是Android上自定义的一个弹出窗口,是在当前activity的顶部的,可以在任意的位置显示,在显示的时候会阻塞UI线程。

2、构造

Popwindow可以直接通过构造方法获取

new PopupWindow(View contentView,intwidth,intheight,booleanfocusable)

构造方法有很多,但是要确保contentview ,width,hight的设置,否则Popwindow不会显示任何内容

这些参数也都可以单独进行设置,比如 popwindow.setContentView(contentView);

3、解析

popwindow的难点就在于这几个参数的设置,一般容易使人迷惑。

popupWindow1.setFocusable(true);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(true);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

关于背景的设置

popupWindow1.setFocusable(true);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(true);//能够响应触摸事件

//popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000));//设置背景

一般情况,如果前面几个设置都设置为true,而且果设置了背景的话,那么你按back键和点击弹窗外的区域能使弹窗消失,如果不设置背景的话,则不会有这样的效果,即使你设置了popupWindow.setOutsideTouchable(true)。

那么这是为什么呢?别人这里已经有完整的解答,就不再赘述了。

详情见:http://www.cnblogs.com/mengdd/p/3569127.html

关于touchable的设置

首先,我们要明确一点,点击到弹窗上的touch事件是首先传递到弹窗上的,如果你设置了touchable为true,那么当前弹窗则会消耗掉touch事件,当前的activity则不会再收到touch事件,反之则会收到事件。

关于focusable的设置

foucsable设置为true,弹窗在弹出后就获取到了焦点,焦点的获取,就告诉设备,外部按键事件向哪里传递。如果弹窗获取到了焦点,此时点击外部按键,按键事件是直接传递给弹窗的。需要注意的是设置focusable为true,并不代表这个控件就获取到了焦点,而是表示可以获取焦点。

popupWindow1.setFocusable(false);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(true);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

这也就解释了,按照上述设置,当你按back键的时候,并不是想象中的popwindow消失,因为弹窗并没有获取到焦点,按键事件直接传递到当前activity了。

popupWindow1.setFocusable(true);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件,设置false也是一样的效果

popupWindow1.setTouchable(true);//能够响应触摸事件

// popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000));//设置背景

当focusable为true后,感觉弹窗影响的区域是整个屏幕(猜测),这么猜测是有根据的,因为这时候点击弹窗内和弹窗外感觉是一样的,弹窗的contentview都会收到同样的事件序列,所以这时候,你就会发现setOutsideTouchalbe并没有什么用。此时,如果touchable为true,一般情况下,无论点击的是弹窗内还是外,当前的activity是收不到任何touch事件的,这也印证了我的猜测。

popupWindow1.setFocusable(true);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(false);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(new ColorDrawable(0x8f000000));//设置背景

当你如上述设置的话,点击弹窗外和点击弹窗内都会使得弹窗消失,因为弹窗内外都是一样的效果,而弹窗又没有消耗事件的话(setTouchable为false),事件首先传递到弹窗,类型是MotionEvent.ACTION_OUTSIDE,此时如果没有设置背景的话,事件将会传递到activity中。如果setTouchable为true的话,那么传递到弹窗的事件类型就是普通类型,而且怎么都不会传递到activity中去。

popupWindow1.setFocusable(true);//获取焦点

popupWindow1.setOutsideTouchable(false);//获取外部触摸事件

popupWindow1.setTouchable(false);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

当然,如果你如上述那样设置,那么弹窗是不会收到任何touch事件的,因为系统判断你都设置false了,就是说不需要了,因此就不会发touch事件给这个弹窗

popupWindow1.setFocusable(false);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(true);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

如果你设置focusable为false的话,那么弹窗影响的区域就是你看到的弹窗内,按上图设置,点击外部区域,事件首先传递到弹窗,类型是MotionEvent.ACTION_OUTSIDE,如果没有设置背景的话,也就是说弹窗没有消耗的话,事件会传递到当前的activity中的。

关于OutsideTouchable的设置

OutsideTouchalbe顾名思义,就是指的是外面的事件,在这里,指的就是弹窗之外touch事件,比如说,像上述设置就能够点击弹窗之外的区域,使得弹窗消失。

popupWindow1.setFocusable(false);//获取焦点

popupWindow1.setOutsideTouchable(true);//获取外部触摸事件

popupWindow1.setTouchable(true);//能够响应触摸事件

popupWindow1.setBackgroundDrawable(newColorDrawable(0x8f000000));//设置背景

上图这么设置,点击弹窗外部区域能够使得弹窗消失,就是因为设置了OutsideTouchalbe为true,导致事件首先传递到弹窗,类型是MotionEvent.ACTION_OUTSIDE。

总结:   设置focusalbe为true,两个效果那么弹窗就会获取焦点,就会使得按键事件分发到弹窗上;弹窗影响的touch事件分发就是整个屏幕,点击弹窗内和弹窗外传递给弹窗的事件序列是一样的

设置背景的话,就等于给弹窗加了个外壳,而这个外壳重写了几个方法能够处理回退和一部分touch事件,这也就是设置了背景后,能够点击回退键和弹窗外使得弹窗消失的原因

设置touchable为true的话,就表示弹窗会消耗掉事件,只要是弹窗内的事件都会被消耗掉,包括focusalbe为true时弹窗外的(因为说过,这时候弹窗内外是一样的)。

设置OutsideTouchable为true的话,就是表示可以收到外部的事件MotionEvent.ACTION_OUTSIDE。

注意: 无论怎么设置,只要弹窗能够收到touch事件,那么一定是弹窗先收到事件,如果弹窗消耗掉了,那么当前activity将收不到touch事件

按键事件是向焦点获取的控件分发的

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

推荐阅读更多精彩内容