Android通過WindowManager實現懸浮框

山有木xi發表於2020-12-06

Android的介面繪製和程式設計,都是通過WindowManager來實現的,而我們要在應用之外繪製一個懸浮框,自然也離不開WindowManager

首先在程式設計之前,要確定是否要相應的許可權

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

還可以通過Settings.ACTION_MANAGE_OVERLAY_PERMISSION檢查許可權,並且讓使用者手動開啟許可權

WindowManager中實現了viewpager的介面,而viewpager中有個addview的方法,新增的view就是我們要顯示的懸浮框

而WindowManager的addview有兩個引數,一個是要加入的view,一個是WindowManager.layoutParam物件,這個物件包含了是否全屏,以及是否攔截觸控事件的引數

同時要注意的是layoutParam中的type變數是用來指定視窗型別的,在設定變數時需要注意區分不同的Android版本

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
    layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
}

在Android8.0以上的版本,如果還是使用TYPE_PHONE那麼將會報異常

而在啟動懸浮框時,為了讓懸浮框和activity或者Fragment脫離,讓其在應用處於後臺時依舊能夠正常使用,將採用service的方式來啟動懸浮框

在啟動之前,先用StartActivityForResult查詢許可權,然後再ActivityResult中獲取返回的值來判斷是否擁有許可權,然後通過startservice啟動服務

在service頁面中初始化windowManager

val windowmanager= context.getSystemService(Context.WINDOW_SERVICE) as WindowManager

獲取需要新增的view

view = LayoutInflater.from(this).inflate(R.layout.float_view, null)

然後通過layoutparams新增

layoutParams = new WindowManager.LayoutParams();
layoutParams.flags = WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
......

需要注意的是,關閉懸浮框時要remove,還不是單純的stopservice,因為那樣會導致懸浮框依舊存在於視窗之中

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2739835/,如需轉載,請註明出處,否則將追究法律責任。

相關文章