版權聲明:本文為xing_star原創文章,轉載請注明出處!
本文同步自http://javaexception.com/archives/109
背景描述
最近一段時間,又看到了這個開源項目BasePopup,記得最早關注這個項目還是17年,看了下commit的提交記錄,作者從16年開始維護到19年,還是很有毅力的,看issue以及文檔覺得作者挺用心的,為作者點贊。做Android開發很多年了,貌似關於PopWindow的使用倒是不是特別的多,以前彈窗的技術實現基本上用的是DialogFragment,自定義一個BaseDialogFragment,約定一些方法,最終子類擴展實現,基本上滿足了絕大多數的彈窗需求,無論是底部彈窗,中間彈窗,全屏彈窗還是什么其他的,有些可以使用AlertDialog等之類的實現,popWindow的使用真的很少碰到,最近接觸的幾個項目,倒是使用Popwindow的地方比較多,當然按理說這些彈窗也可以用Dialog或者是DialogFragment實現,不過項目已經采用了PopWindow的方式,那就盡量保持統一的技術實現。
PopWindow的使用場景
一般來說,包含用來做條件篩選,比如美團上的多級條件篩選,或者是其他app上的條件篩選,仿BootomSheet底部彈出的效果(用Dialog,PopWindow都可以實現),仿朋友圈評論點贊的PopWindow效果,仿AlertDialog彈出類的PopWindow(這種既然系統提供了,那就用系統的,就不需要自己在自定義PopWindow實現這種效果),以及有動畫漸變漸進式效果的彈窗效果,比如QQ空間里面的那個點擊彈框,基本上用PopWindow也可以實現絕大多數的彈窗需求(可能你會碰到很多坑,所以這里還是得借助下BasePopup),PopWindow有一大優勢,就是可以細粒度的控制彈窗的顯示位置,比如當前view的上下左右方位等,或者是稍微偏移點,都是可行的。這一點是Dialog,或者是DialogFragment無法比的。
使用默認的PopWindow會碰到的問題
相信你在用PopWindow過程中碰到了不少問題,這里我們列舉幾個常見的問題。
1. 設置主布局根節點大小無效(layout_width, layout_height),這種情況下我們需要給根節點再加一層父容器,讓父容器成為xml根節點
2.Android N以上設備popWindow顯示有問題,以及存在陰影覆蓋問題等,這種看這篇描述的http://javaexception.com/archives/108
3.使用window測量,控制大小,測量的寬高都是0
4. 以及諸多更多的細節點,不一一舉例了
BasePopup的demo效果
依次是底部彈窗,popWindow支持輸入法輸入文本,仿朋友圈點贊評論效果
demo apk體驗地址為https://fir.im/pfc9
項目使用
想要使用BasePopup直接到對應的github上按照對應的文檔接入,教程寫的很詳細,有問題也可以在issue里面查找,再貼一下項目地址https://github.com/razerdp/BasePopup。
參考資料
popupWindow使用常見的錯誤 https://www.jianshu.com/p/d352847cc08b
BasePopup項目地址 https://github.com/razerdp/BasePopup