Android關於彈窗的實現大體有兩種方式實現:AlertDialog和PopupWindow,固然還有使用Activity並配合Dialog主題實現彈窗的; PopupWindow和AlertDialog二者的最主要的區別就是顯示位置問題: 位置是否固定,AlertDialog顯示位置相對是固定的,直接顯示在Window的中間位置,而PopupWindwo則能夠在Window的任意位置顯示;
PopupWindow.mFocusable變量,做用是設置PopupWindow是否能夠接受焦點事件,要設置爲true後(經過PopupWindow.setFocusable(true)或PopupWindow的含有三個參數的構造函數,最後一個參數表明該屬性),點擊PopupWindow外部會消失,Back鍵也會消失,該值默認爲false,若爲false,這兩個事件都不會起做用;html
PopupWidow.setTouchable(true);做用時設置PopupWindow可接受觸摸事件,設置這個,點擊外部區域不會消失,並且點擊Back鍵也不消失,該值默認爲true,因此不用顯示設置;git
PopupWindow.setOutsideTouchable(true);做用是設置可接受外部區域的觸摸事件,默認爲false,設置爲true後,可接受外部區域點擊事件,點擊外部區域會消失,可是點擊Back鍵仍是不消失;github
PopupWindow.showAsDropDown()方法是設置PopupWindow顯示在某個控件之下,能夠設置左右偏移量,至關於下拉彈框;ide
PopupWindow.showAtLocation()方法能夠指定PopupWindow在Window上的任意位置,注意:第一個參數不是anchor View,而是爲了從父視圖來獲取getWindowToken()標記的,獲取一個建立新Window的Window Token值(令牌),第二個參數是經過Gravity控制PopupWindow彈出的大體位置,後面兩個參數是彈出位置在x/y方向上的偏移量;函數
建立PopupWindow的時候指定寬高值爲contentView的寬高值時,showAsDropDown()方法可以自適應,若是設置爲wrap_content,showAsDropDown()方法會認爲下面的空間一直很充足,這樣就不會自適應,可能會被擋住,因此:若是PopupWindow裏面有ListView,ScrollView時,必定要動態設置PopupWindow的大小;動畫
第一個參數上面已經說了,不是anchor View,只是經過該View獲取建立新Window的Window Token(看源碼),第二個參數的做用是設置相對於Window的位置,如Gravity.TOP.Gravity.START等,注意,若是設置了後面兩個位置精確值,第二個參數就沒有效果了,能夠設置爲Gravity.NO_GRAVITY了;code
主要是第四個參數,第四個參數的做用是 @param gravity Alignment of the popup relative to the anchor,相對於anchor View(錨)的對齊方式;htm
若是單獨設置第二,三個參數,那麼這兩個值表明的偏移量是沒有效果的,只有同時設置後三個參數,偏移量下x/y值纔會起做用;blog
建立PopupWindow時候指定高寬時showAsDropDown可以自適應,若是設置爲wrap_content,showAsDropDown會認爲下面空間一直很充足,注意:若是PopupWindow裏面有ListView,ScrollView時,必定要動態設置PopupWindow的大小事件
經過PopupWindow.setAnimationStyle()方法設置動畫彈出和消失的效果;
直接參考這裏 Android PopupWindow使用方法小結 - 式 - 博客園