Android中的懸浮框

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

懸浮窗其實在移動平臺的使用中會經常的遇到,無論是系統自帶的懸浮窗,還是影片軟體的退出時出現的懸浮窗,無論是聊天軟體的通話懸浮窗,還是各大管家軟體為了清理後臺的懸浮窗,都會經常性的出現在我們的生活使用當中

而其實,寫一個懸浮窗也是一件不難的事情

首先,我們需要判斷申請了相關的許可權

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

然後在程式碼中需要判斷,使用者是否給予了我們的軟體相關的許可權

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (!Settings.canDrawOverlays(this)) {
        Toast.makeText(this, "暫無懸浮窗許可權,請授權", Toast.LENGTH_SHORT)
        GlobalDialogSingle(
            this, "", "請開啟懸浮窗許可權", "去開啟"
        ) { dialog, which ->
            dialog.dismiss()
            startActivityForResult(
                Intent(
                    Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:$packageName")
                ), 0
            )
        }.show()
    } else {
        moveTaskToBack(true)//讓程式退往後臺,讓懸浮窗進入前臺
        val intent = Intent(this@MainActivity, FloatServices::class.java)
        hasBind = bindService(intent, ServiceCon, BIND_AUTO_CREATE)
    }
}

而FloatServices需要繼承service,並在其中處理懸浮窗的各種事件和顯示處理

@Nullable
@Override
public IBinder onBind(Intent intent) {
    showWindow();//懸浮窗顯示事件
    ClickFloat();//處理點選事件
    return new MyBinder();
}

懸浮窗相關引數

private void showWindow() {
    winManager = (WindowManager) getApplication().getSystemService(Context);
    wmParams = getParams();
    wmParams.gravity = Gravity.RIGHT| Gravity.TOP;
    wmParams.x = winManager.getDefaultDisplay().getWidth();
    wmParams.y = 500;
    inflater = LayoutInflater.from(getApplicationContext());
    mFloatingLayout = inflater.inflate(R.layout.remoteview, null);
    winManager.addView(mFloatingLayout, wmParams);
}

點選事件

private void ClickFloat() {
//在這其中處理懸浮窗的點選或者移動事件
}


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

相關文章