FBI Warning:歡迎轉載,但請標明出處:http://blog.csdn.net/codezjx/article/details/45220101,未經本人同意請勿用於商業用途,感謝支持!
原理:在頂層顯示一個Dialog,讓其不可Cancel(無法響應任何點擊),並將其設置爲最頂層的type,然後將其灰色區域設置爲透明即可完成該效果(免Root,免系統權限,親測包括Android5.0也有這個漏洞)。下面是詳細代碼與解析:
Dialog dialog = new AlertDialog.Builder(getApplicationContext(), R.style.Transparent)
.setView(view)
.create();
Window window = dialog.getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.BOTTOM;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(params);
window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
dialog.setCancelable(false);
dialog.show();
Dialog的背景Style:
<style name="TransparentWindowBg">
<item name="android:windowBackground">@android:color/transparent</item>
</style>
必須注意以下幾點:
1:使用getApplicationContext()而不是Activity Context。因爲使用activity context不能覆蓋底部那條Navigation Bar,用application context則影響範圍可以覆蓋整個屏幕(屌爆了有木有)。
2:創建dialog的時候在構造函數傳入一個Transparent的style,這個方法能dialog周圍的灰色區域變爲透明,更神不知鬼不覺,感覺有點猥瑣了有木有。
3:設置window type爲WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,查看官方文檔: internal system error windows, appear on top of everything they can,他是系統內部錯誤彈窗,顯示在任何界面之上,權限這個是最高的。
4:最後Manifest加入以下權限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
使用上面的方法的時候一定要注意:這層view會在鎖屏界面之上、還有長按電源鍵的關機dialog之上。所以,屏蔽了之後,除非你長按power鍵關機,否則只能通過代碼將其移除解決屏蔽。使用場景的話,各位程序猿發揮創造力吧!