Android學習之Window窗口

Android Window機制學習筆記

在使用Window Flag實現界面全屏功能時,發現自身對Android Window機制缺乏系統認知,因此進行了專項學習與整理。
本文主要參考以下優質資料:

  • Android的Window詳解
  • Android官方Window文檔

Window基本概念

1. Window的定義與特性

Window(窗口)是用戶熟悉的圖形界面元素,類似于Windows操作系統中的視窗概念。在Android中,Window作為系統與用戶交互的界面載體,其核心特性包括:

  1. 層級結構:采用Z-order排序管理,層級通過WindowManager.LayoutParams.type屬性指定。
  2. 顯示區域:定義內容顯示的位置和范圍。
  3. 輸入事件處理:負責接收和處理觸摸、按鍵等用戶輸入事件。

2. Window的核心作用

Window的核心作用是內容呈現載體。它本質上是一個顯示區域,具體內容依賴于View體系(如EditText、ImageView等)填充。多個View在Window上組合排列,最終構成用戶界面。Window與View的關系特點:

  • 容器與內容:Window是容器,View是內容。
  • 一對一關系:每個Activity默認對應一個Window。
  • 樹形結構:Window包含View樹的根節點DecorView。

3. Window的實現機制

Window的實現依賴于以下關鍵系統組件:

  1. WindowManager:作為應用層接口,負責管理Window的添加、刪除和更新操作。
  2. WindowManagerService (WMS):系統核心服務,實際執行Window的管理、布局和層級調度。
  3. SurfaceFlinger:負責將各個Window的Surface合成并最終渲染到顯示設備。

4. Window的類型

Android系統定義了多種Window類型,主要分為三類:

  1. 應用Window (TYPE_APPLICATION):應用程序主窗口。
  2. 子Window (TYPE_APPLICATION_PANEL, TYPE_APPLICATION_SUB_PANEL等):必須依附于父應用Window。
  3. 系統Window (TYPE_SYSTEM_ALERT, TYPE_TOAST, TYPE_STATUS_BAR等):具有特殊權限或系統級別的窗口。

:在查閱資料時注意到"View樹"概念,這與Android繪制機制緊密相關。View樹的遍歷和測量涉及measurelayoutdraw三個階段,直接影響Window的最終渲染效果。這些內容將在后續深入學習渲染原理時詳細研究,本文重點聚焦Window本身。

Window的層級結構

WindowManager的核心功能之一是管理窗口的顯示層級(Z-order)。Android系統的窗口采用樹形結構進行管理,每個Window的層級屬性決定了其顯示順序和交互優先級。

窗口層級的基本原理

當多個界面元素疊加時,Z-order數值較大的窗口會覆蓋在數值較小的窗口之上(越靠近用戶)。WindowManager根據此數值決定窗口的堆疊順序。

常見界面元素的層級規則

常見界面元素遵循特定的層級規則(按Z-order由低到高):

窗口類型 (WindowManager.LayoutParams.type)典型代表描述
TYPE_BASE_APPLICATION主界面窗口應用程序的基礎界面層(如Activity的主視圖)。
TYPE_APPLICATION_PANEL彈窗窗口應用程序內的對話框、提示框(如確認對話框)。
TYPE_INPUT_METHOD輸入窗口軟鍵盤等輸入法窗口,具有較高優先級以保證輸入體驗。
TYPE_STATUS_BAR_PANEL下拉菜單 / 通知中心展開的系統級下拉菜單或通知面板,通常覆蓋整個界面。
TYPE_NAVIGATION_BAR導航欄屏幕底部的三鍵虛擬導航欄,顯示層級處于最高級別(即使在全屏狀態下)。

層級應用實例

層級管理在具體場景中的應用:

  • 輸入場景:輸入框獲得焦點時,系統自動提升相關窗口層級,確保軟鍵盤不遮擋輸入區域。
  • 彈出通知:系統通知(如TYPE_SYSTEM_ALERT)臨時提升至最高層級,保證用戶及時可見。
  • 全屏游戲:游戲畫面(TYPE_APPLICATION)占據全屏,但導航欄(TYPE_NAVIGATION_BAR)仍可在需要時顯示在最上層。
  • 支付安全:支付密碼界面設置FLAG_SECURE并保持較高層級,防止被惡意覆蓋或截屏。

WindowManager的操作接口

開發者主要通過WindowManager接口操作Window:

  1. addView(View view, ViewGroup.LayoutParams params):添加新的窗口視圖。
  2. removeView(View view):移除窗口視圖。
  3. updateViewLayout(View view, ViewGroup.LayoutParams params):更新窗口布局參數。
  4. getDefaultDisplay():獲取顯示設備相關信息(如尺寸、旋轉狀態)。

典型用法示例

// 獲取WindowManager實例
val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager// 創建布局參數 (示例:創建一個懸浮窗)
val params = WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT, // 寬度WindowManager.LayoutParams.WRAP_CONTENT, // 高度WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // 類型 (系統懸浮窗,需權限)WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE // 標志 (不獲取焦點)or WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, // 標志 (允許延伸至狀態欄下)PixelFormat.TRANSLUCENT // 像素格式 (支持透明)
)// 添加窗口視圖
wm.addView(myCustomView, params)

這種層級管理機制確保了界面元素的有序呈現和流暢交互,為開發者提供了靈活的控制能力。

Window的屬性

Window的屬性共同定義了其顯示特性和行為。以下是在原有分類基礎上補充細節、擴展場景及實用案例的完整解析:

1. type屬性(窗口類型)

type屬性決定窗口的基本類別和層級,除基礎分類外,補充系統級場景及典型類型:

  • 應用窗口
    • TYPE_APPLICATION:普通應用程序主窗口(如微信聊天頁),依附于Activity生命周期。
    • TYPE_APPLICATION_STARTING:應用啟動過渡窗口(閃屏頁),提升加載感知。
  • 系統級窗口(通常需要特殊權限)
    • TYPE_STATUS_BAR:系統狀態欄窗口(顯示時間、電量等),層級高于普通應用窗口。
    • TYPE_SYSTEM_ALERT:系統警告窗口(權限請求、系統更新彈窗),需SYSTEM_ALERT_WINDOW權限。
  • 特殊用途窗口
    • TYPE_TOAST:Toast提示窗口(臨時懸浮的輕量級提示如“操作成功”),自動消失且不阻塞交互。
    • TYPE_APPLICATION_PANEL:子窗口(依附于父窗口的面板如下拉菜單、彈窗選項),不可獨立存在。

2. flag屬性(窗口標志)

flag通過位掩碼(|)組合控制窗口行為,補充進階標志及應用場景:

  • 視覺與交互控制
    • FLAG_SECURE:禁止截圖/錄屏(保護支付密碼等敏感內容)。
    • FLAG_KEEP_SCREEN_ON:保持屏幕常亮(適用于視頻播放、導航應用)。
  • 系統欄與布局延伸
    • FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS:允許應用繪制狀態欄/導航欄背景(實現透明狀態欄效果,需配合View.SYSTEM_UI_FLAG_LAYOUT_*)。
    • FLAG_LAYOUT_NO_LIMITS:允許窗口內容延伸至屏幕外(適用于側滑菜單、全屏手勢交互區域)。
  • 焦點與輸入管理
    • FLAG_NOT_FOCUSABLE:窗口不可獲取焦點(如半透明背景蒙層,點擊事件穿透到底層窗口)。
    • FLAG_NOT_TOUCH_MODAL:非模態窗口,觸摸事件可傳遞到后面的窗口(常用于懸浮窗)。

3. 軟鍵盤屬性(windowSoftInputMode)

控制軟鍵盤與窗口的交互邏輯,典型場景及組合:

  • SOFT_INPUT_ADJUST_RESIZE:窗口整體尺寸調整(高度壓縮)以適應鍵盤(聊天界面底部輸入框)。
  • SOFT_INPUT_ADJUST_PAN:平移窗口內容避免輸入框被遮擋(長列表中的表單輸入)。
  • SOFT_INPUT_STATE_HIDDEN | SOFT_INPUT_ADJUST_NOTHING:頁面加載時主動隱藏鍵盤,且不進行任何布局調整(適用于純展示型界面)。
  • SOFT_INPUT_STATE_ALWAYS_VISIBLE:當窗口獲得焦點時,強制顯示鍵盤(適用于搜索頁等)。

4. 系統UI可見性控制(systemUiVisibility - View級別)

注意systemUiVisibility是設置在DecorView(屬于View層級)上的標志,用于控制沉浸式體驗:

  • View.SYSTEM_UI_FLAG_FULLSCREEN:隱藏狀態欄,內容延伸至屏幕頂部(視頻全屏播放)。
  • View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隱藏導航欄(底部虛擬按鍵),適用于游戲、電子書等全沉浸場景。
  • View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY:粘性沉浸模式 - 手勢滑動臨時顯示系統欄,松手后自動隱藏(如YouTube全屏播放邏輯)。
  • View.SYSTEM_UI_FLAG_LAYOUT_STABLE:保持布局穩定,防止系統欄顯隱導致內容跳動。
  • View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION / View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:允許內容布局延伸至被隱藏的系統欄區域,避免出現突兀黑邊。

組合使用示例 (Kotlin)

window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_FULLSCREENor View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKYor View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)

5. 其他重要屬性(視覺與交互)

  • 透明度與模糊
    • alpha (0.0f - 1.0f):設置窗口整體透明度(0.5f用于半透明蒙層)。
    • dimAmount (0.0f - 1.0f):配合FLAG_DIM_BEHIND使用,控制窗口后面內容的模糊(變暗)程度(0.3f為輕度模糊背景)。
  • 動畫與樣式
    • 窗口過渡動畫:通過Activity主題配置android:windowAnimationStyle(如@android:style/Animation.Dialog實現彈窗縮放效果)。
    • 隱藏默認標題欄:在onCreate()中調用requestWindowFeature(Window.FEATURE_NO_TITLE)
  • 尺寸與布局
    • width / height:可使用MATCH_PARENT, WRAP_CONTENT或具體像素值(對話框常用WRAP_CONTENT,Activity主窗口用MATCH_PARENT)。
    • gravity:控制窗口在屏幕上的初始位置(如Gravity.CENTER使對話框居中)。
    • x / y:指定窗口的絕對位置(常用于懸浮窗定位)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84631.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84631.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84631.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為云 Flexus+DeepSeek 征文|搭建部署Dify-LLM推理引擎,賦能AI Agent智能體實現動態聯網搜索能力

華為云 Flexus 云服務器 X 實例專門為 AI 應用場景設計。它提供了強大的計算能力,能夠滿足 DeepSeek 模型以及后續搭建 AI Agent 智能體過程中對于數據處理和模型運行的高要求。在網絡方面,具備高速穩定的網絡帶寬,這對于需要頻繁聯網搜索信息…

Python 100個常用函數全面解析

Python 100個常用函數全面解析 1. 類型轉換函數 1.1 int() 將字符串或數字轉換為整數。 # 基本用法 int(123) # 123 int(3.14) # 3# 指定進制轉換 int(1010, 2) # 10 (二進制轉十進制) int(FF, 16) # 255 (十六進制轉十進制)# 臨界值處理 int() # ValueError: …

分享在日常開發中常用的ES6知識點【面試常考】

前言 在日常的業務開發中,可以熟悉運用掌握的知識點快速解決問題很重要。這篇分享JS相關的知識點,主要就是對數據的處理。 注意:本篇分享的知識點,只是起到一個拋磚引玉的作用,詳情的使用和更多的ES6知識點還請參考官…

CHI協議驗證中的異常及邊界驗證

CHI協議驗證中的異常及邊界驗證 針對 CHI 協議的錯誤注入工具、覆蓋率衡量方法及實際項目中的投入平衡 CHI 協議作為多核系統中復雜的緩存一致性協議,驗證其行為需要強大的工具和方法來執行錯誤注入和邊界條件測試,并衡量測試覆蓋率。以下詳細討論常用工具、覆蓋率評估方法及…

技術專欄|LLaMA家族——模型架構

LLaMA的模型架構與GPT相同,采用了Transformer中的因果解碼器結構,并在此基礎上進行了多項關鍵改進,以提升訓練穩定性和模型性能。LLaMA的核心架構如圖 3.14 所示,融合了后續提出的多種優化方法,這些方法也在其他模型&a…

電腦插入多塊移動硬盤后經常出現卡頓和藍屏

當電腦在插入多塊移動硬盤后頻繁出現卡頓和藍屏問題時,可能涉及硬件資源沖突、驅動兼容性、供電不足或系統設置等多方面原因。以下是逐步排查和解決方案: 1. 檢查電源供電問題 問題原因:多塊移動硬盤同時運行可能導致USB接口供電不足&#x…

Go 語言實現高性能 EventBus 事件總線系統(含網絡通信、微服務、并發異步實戰)

前言 在現代微服務與事件驅動架構(EDA)中,事件總線(EventBus) 是實現模塊解耦與系統異步處理的關鍵機制。 本文將以 Go 語言為基礎,從零構建一個高性能、可擴展的事件總線系統,深入講解&#…

npm ERR! @biomejs/biome@1.9.4 postinstall: `node scripts/postinstall.js`

npm install 報錯如下, npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! @biomejs/biome@1.9.4 postinstall: `node scripts/postinstall.js` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the @biomejs/biome@1.9.4 postinstall script. npm ERR! This is pro…

APMPlus × veFaaS 一鍵開啟函數服務性能監控,讓函數運行全程可觀測

資料來源:火山引擎-開發者社區 近年來,無服務器架構(Serverless)的崛起讓開發者得以從基礎設施的復雜性中解放,專注于業務邏輯創新。但隨著采用率提升,新的問題開始出現——函數實例的短暫生命周期、動態變…

瑪哈特零件矯平機:精密制造中的平整度守護者

在精密制造、模具、沖壓、鈑金加工、汽車零部件、航空航天以及電子設備等眾多工業領域,零件的平整度(Flatness)是一項至關重要的質量指標。微小的翹曲、扭曲或彎曲都可能導致裝配困難、功能失效、外觀缺陷甚至影響整機性能。為了消除零件在加…

std::make_shared簡化智能指針 `std::shared_ptr` 的創建過程,并提高性能(減少內存分配次數,提高緩存命中率)

std::make_shared 是 C 標準庫中的一個函數模板,用于簡化智能指針 std::shared_ptr 的創建過程。引入 std::make_shared 的主要原因是提高代碼的安全性、性能和可讀性。以下是詳細分析: 1. 安全性提升 避免顯式調用 new 導致的錯誤 在不使用 std::make…

JDK版本如何絲滑切換

一句話總結 》》》步驟分為: 下載對應JDK配置環境變量 下載JDK 如何下載JDK這里不必多提,提出一點,就是多個版本的JDK最好放在一個文件夾里(忽略我的java文件夾,這里都是不同的jdk版本): 配置環…

Rust 通用代碼生成器:蓮花,紅蓮嘗鮮版三十六,啞數據模式圖片初始化功能介紹

Rust 通用代碼生成器:蓮花,紅蓮嘗鮮版三十六,啞數據模式圖片初始化功能介紹 Rust 通用代碼生成器蓮花,紅蓮嘗鮮版三十六。支持全線支持圖片預覽,可以直接輸出帶圖片的啞數據模式快速原型。啞數據模式和枚舉支持圖片。…

45. Jump Game II

目錄 題目描述 貪心 題目描述 45. Jump Game II 貪心 正向查找可到達的最大位置 時間復雜度O(n) class Solution { public:int jump(vector<int>& nums) {int n nums.size();if(n 1)return 0;int cur_cover 0;int cover 0;int res 0;for(int i 0;i < …

model.classifier 通常指模型的分類頭 是什么,詳細舉例說明在什么部位,發揮什么作用

model.classifier 通常指模型的分類頭 是什么,詳細舉例說明在什么部位,發揮什么作用 在深度學習模型中,分類頭(Classifier Head)是指模型末端用于完成分類任務的組件,通常是一個或多個全連接層(線性層)。它的作用是將模型提取的高層語義特征映射到具體的分類標簽空間。…

機器學習+城市規劃第十四期:利用半參數地理加權回歸來實現區域帶寬不同的規劃任務

機器學習城市規劃第十四期&#xff1a;利用半參數地理加權回歸來實現區域帶寬不同的規劃任務 引言 在城市規劃中&#xff0c;如何根據不同地區的地理特征來制定有效的規劃方案是一個關鍵問題。不同區域的需求和規律是不同的&#xff0c;因此我們必須考慮到地理空間的差異性。…

Kivy的ButtonBehavior學習

Kivy的ButtonBehavior學習 ButtonBehavior 簡介1、主要特點2、基本用法3、主要事件4、常用屬性5、方法代碼示例 文檔&#xff1a;https://kivy.org/doc/stable/api-kivy.uix.behaviors.button.html#kivy.uix.behaviors.button.ButtonBehavior ButtonBehavior 簡介 ButtonBeha…

WPS中將在線鏈接轉為圖片

WPS中將在線鏈接轉為圖片 文章目錄 WPS中將在線鏈接轉為圖片一&#xff1a;解決方案1、下載圖片&#xff0c;精確匹配&#xff08;會員功能&#xff09;2、將在線鏈接直接轉為圖片 一&#xff1a;解決方案 1、下載圖片&#xff0c;精確匹配&#xff08;會員功能&#xff09; …

API:解鎖數字化協作的鑰匙及開放實現路徑深度剖析

API:解鎖數字化協作的鑰匙及開放實現路徑深度剖析 一、API 的概念與本質 (一)定義與基本原理 API(Application Programming Interface,應用程序編程接口)是一組定義、協議和工具,用于構建和集成軟件應用程序。它如同一個精心設計的合約,詳細規定了軟件組件之間相互交…

Azure 虛擬機端口資源:專用 IP 和公共 IP Azure Machine Learning 計算實例BUG

## 報錯無解 找不到Azure ML 計算實例關聯的 NSG .env 文件和 ufw status&#xff1a; .env 文件中 EXPOSE_NGINX_PORT8080 是正確的&#xff0c;它告訴 docker-compose.yaml 將 Nginx 暴露在宿主機的 8080 端口。 sudo ufw status 顯示 Status: inactive&#xff0c;意味著宿…