一、懸浮窗簡介
懸浮窗是一個可以浮在其他應用界面之上的視圖,常常作為與用戶交互的工具,允許用戶快速地執行某些操作,同時也可以顯示一些信息。懸浮窗廣泛應用於遊戲、社交和工具類應用中,在手機屏幕較小的情況下充分利用空間,提升用戶體驗。
懸浮窗不同於普通的View,它需要特殊的權限和設置才能正常顯示。在Android 8.0及以上的系統版本中,需要動態請求懸浮窗權限才能顯示懸浮窗。在Android系統版本低於8.0的手機上,懸浮窗權限默認開啟,但需要在應用的manifest文件中聲明該權限。
二、實現懸浮窗的方法
1. 使用系統API
Android提供了WindowManager類來管理窗口,通過創建一個帶有TYPE_SYSTEM_ALERT類型的WindowManager.LayoutParams對象並將其添加到WindowManager中即可實現一個基本的懸浮窗。具體實現步驟如下:
// 1. 創建窗體布局 mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE); mLayoutParams = new WindowManager.LayoutParams(); mLayoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; mLayoutParams.format = PixelFormat.TRANSPARENT; mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; mLayoutParams.gravity = Gravity.LEFT | Gravity.TOP; mLayoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; mLayoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mLayoutParams.x = 0; mLayoutParams.y = 0; // 2. 將窗體布局添加到WindowManager中 mWindowManager.addView(mFloatingView, mLayoutParams);
其中,type參數設置為TYPE_SYSTEM_ALERT,表示以系統級別的方式顯示視圖。format參數設置為TRANSPARENT,使窗體背景為空,FLAG_NOT_TOUCH_MODAL和FLAG_NOT_FOCUSABLE參數表示窗口不會影響其他應用的觸摸事件和聚焦事件,width和height參數設置為WRAP_CONTENT,表示視圖寬度和高度會自適應內容大小。
2. 使用第三方庫
除了使用系統API實現懸浮窗外,也可以使用第三方庫來簡化開發流程。比如,可以使用GitHub上的FloatingView庫實現懸浮窗。這個庫提供了很多懸浮窗功能,如動畫效果、自定義樣式等。
使用FloatingView庫也很簡單,只需要在build.gradle文件中添加以下依賴即可:
dependencies { implementation 'com.github.pinguo-zhouwei:FloatingView:latest.release' }
然後在代碼中創建FloatingView,並添加到視圖中即可:
FloatingViewManager mFloatingViewManager = new FloatingViewManager(this); FloatingView mFloatingView = new FloatingViewManager(getApplicationContext()).addView(R.layout.floating_view, new FloatingViewManager.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT), new FloatingViewManager.ViewStateListener() { @Override public void onPositionUpdate(int x, int y) { // 懸浮窗移動時的回調 } @Override public void onDismiss() { // 懸浮窗關閉時的回調 } @Override public void onShow() { // 懸浮窗顯示時的回調 } }); mFloatingViewManager.addView(mFloatingView);
三、懸浮窗的常見問題及解決方法
1. 懸浮窗權限問題
在Android 8.0及以上的系統版本中,需要動態申請懸浮窗權限才能顯示懸浮窗。如果沒有權限,將無法在應用外部顯示懸浮窗。可以通過以下代碼來動態申請權限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(MainActivity.this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); } }
其中,ACTION_MANAGE_OVERLAY_PERMISSION是打開懸浮窗設置頁面的常量,Uri.parse(“package:” + getPackageName())是一個URI地址,打開設置頁面時會將此參數傳遞給系統。
2. 懸浮窗生命周期問題
當應用退出時,懸浮窗應該被關閉,並釋放相應的資源,以防止內存泄漏。可以通過以下代碼來實現生命周期管理:
@Override protected void onDestroy() { super.onDestroy(); if (mWindowManager != null) { mWindowManager.removeView(mFloatingView); } }
當Activity銷毀時,會調用onDestroy()方法,此時需要將懸浮窗從WindowManager中移除,防止懸浮窗在應用退出後還顯示在屏幕上。
3. 懸浮窗焦點問題
在Android系統中,懸浮窗默認不能獲得焦點,也就無法接收用戶的鍵盤輸入。可以通過以下代碼來設置懸浮窗獲得焦點:
mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
將FLAG_NOT_FOCUSABLE改為FLAG_NOT_TOUCH_MODAL | FLAG_NOT_FOCUSABLE,就可以讓懸浮窗獲得焦點,接收用戶的鍵盤輸入。
四、總結
懸浮窗是一種常用的交互手段,可以提升用戶體驗,但是在實現時需要處理一些問題,如權限、生命周期和焦點等。通過正確地處理這些問題,可以實現良好的懸浮窗體驗。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/288907.html