Android焦點機制結合WMS

文章前提:

  • 了解WMS基本作用
  • 了解window的概念,phoneWindow,rootViewImpl
  • 了解view的事件分發

開始:

講三件事情:

  1. window的創建,更新
  2. 焦點的更新
  3. 事件的分發

Window的創建,更新:

window的創建:

最終都是通過和WMS通信完成的。

WMS管理著window的增,刪,改以及window層級的管理(Z-order的堆棧管理...),因此window的創建我們自然就聯想到了WMS。

performLaunchActivity()方法中,也就是在 Activity 的啟動過程中的幾乎最后一步執行:

調用activity.attch()方法

?

創建PhoneWindow

handleResumeActivity()處理onResume(),因此在performLaunchActivity后面執行在這個方法中調用了addView方法:

這個addView由WindowManagerGloal實現,其中創建RootViewImpl,并進行setView()

WindowManagerGloal:

這個root就是RootViewImpl,接下來到setView方法中

通過addToDisPlayAsUser方法調用,

在其中調用WMS的addWindow方法:

此時終于到了WMS的addWindow方法中,這里面做了四件事:

  • 窗口檢查
  • token處理
  • windowState的創建
  • displayContent的創建和配置

執行完后,由WMS直接和SurfaceFlinger通信,進行顯示,此時我們的window就顯示出來了。

window的更新:

什么情況下會出現window的更新?

鍵盤出現,窗口需要重新計算布局并更新顯示內容。

只是api執行的不同,不過邏輯同樣,app進程發起更新請求,由WindowManagerGlobal進行處理,這個類和WMS通過IWindowSession進行通信,實現更新操作。

焦點的更新:

焦點的基本概念

  • 焦點(Focus):UI元素獲得焦點后,能夠接收用戶輸入事件,如按鍵和觸摸事件。
  • 默認焦點:當一個Activity啟動時,系統會自動為某個可交互的控件設置默認焦點。

焦點的獲取和失去

  • 獲取焦點:一個視圖可以通過調用requestFocus()方法來請求獲取焦點。
  • 失去焦點:一個視圖可以通過調用clearFocus()方法來主動放棄焦點。

焦點的移動

  • 鍵盤導航:用戶可以使用方向鍵(如上、下、左、右)在可獲得焦點的視圖之間導航。
  • Tab順序:使用android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft, android:nextFocusRight屬性來指定焦點導航的順序。

處理焦點沖突

  • focusable屬性的合理使用:確保只有需要交互的視圖設置為可獲得焦點。
  • 自定義焦點順序:通過XML屬性或代碼來明確設置焦點導航順序,避免焦點在不合理的視圖之間跳轉。

OK,開始焦點機制的部分:

文章前提:

  • 了解InputManagerService
  • 了解WMS
  • 了解RootViewImpl

想要使得焦點更新,需要操作:

分為兩種:

  • requestFocus()
  • 有外部點擊

requestFocus:

會通過Binder,通過WMS,WMS中會判斷焦點是否更新。

外部點擊:

SurfaceFlinger接收到點擊之后,通過InputChannel,發送給WMS,WMS內持有所有window的集合,會判斷是否需要更新window焦點,通過WMS,surfaceFlinger得知需要更新的window之后,直接通知對應的window的RootViewImpl,通知DecorView,通知Activity,通知PhoneWindow,通知DecorView,然后繼續向下分發......下面就是老生常談的view事件分發機制了......

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

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

相關文章

基于 Redis 實現秒殺資格判斷,提升并發性能

在互聯網電商平臺上,秒殺活動往往會吸引大量用戶同時搶購,如何高效地處理高并發請求,保證用戶體驗,是一個重要的技術挑戰。本文將介紹如何基于 Redis 實現秒殺資格的判斷,提高并發性能。 基本思路 秒殺活動的核心流程…

AI 編程還有前景嘛?

自從各個大廠相繼出品 AI 編程助手之后,AI 在編程領域的發展,可謂是幾無寸進。 相比于 AI 在多模態領域火熱,AI 在編程領域的熱度已經完全下來了。 阿七在公眾號搜索了關鍵詞「AI編程」,發現搜索出來的公眾號寥寥無幾&#xff0…

LLM生成模型在生物蛋白質應用:ESM3

參考: https://github.com/evolutionaryscale/esm 通過GPT模型原理,輸入蛋白質序列等模態輸出預測的蛋白質序列及結構 使用 參考:https://colab.research.google.com/github/evolutionaryscale/esm/blob/main/examples/generate.ipynb#sc…

(六)使用統計學方法進行變量有效性測試(43道選擇題)

本文整理了使用統計學方法進行變量有效性測試相關的練習題,共43道,適用于想鞏固理論基礎的同學。來源:如荷學數據科學題庫(CDA二級-第7章)。 1) 2) 3) 4) 5)…

【無人機三維路徑規劃】基于樹木生長算法TGA實現復雜城市地形下無人機避障三維航跡規劃附Matlab代碼

% 定義無人機起始位置和目標位置 start_point [0, 0, 0]; % 起始位置 [x, y, z] target_point [100, 100, 100]; % 目標位置 [x, y, z] % 定義城市地形和障礙物信息 city_map imread(‘city_map.png’); % 城市地形圖像 obstacles [ 20, 30, 10; % 障礙物1位置 [x, y, z] …

三分之一的違規行為未被發現

Gigamon 調查顯示,隨著漏洞的針對性越來越強、越來越復雜,企業在檢測漏洞方面也面臨越來越大的困難,超過三分之一的企業表示,現有的安全工具無法在漏洞發生時檢測到它們。 隨著混合云環境變得越來越復雜,以及惡意行為…

Java 語言特定指南

Java 語言特定指南 本 Java 入門指南將教您如何使用 Docker 創建一個容器化的 Spring Boot 應用程序。在本模塊中,您將學習如何: 使用 Maven 容器化并運行一個 Spring Boot 應用程序設置本地開發環境以將數據庫連接到容器、配置調試器,并使…

篩斗數據:引領未來,以技術創新推動在線推廣新紀元

在數字化浪潮的推動下,企業在線推廣已成為市場拓展的關鍵手段。然而,在海量信息中精準定位目標用戶,有效提升轉化率,卻是一大挑戰。篩斗數據,作為一家專注于數據提取與分析的技術公司,正以其獨特的技術優勢…

云計算基礎知識

前言: 隨著ICT技術的高速發展,企業架構對計算、存儲、網絡資源的需求更高,急需一種新的架構來承載業務,以獲得持續,高速,高效的發展,云計算應運而生。 云計算背景 信息大爆炸時代&#xff1a…

Linux 標準IO的fopen和fclose

getchar(),putchar() ‐‐‐‐ 一個字符 gets(buf),puts(buf) ‐‐‐‐ 一串字符 scanf(),printf() ‐‐‐‐ 一個字符,一串字符都可以 fopen函數的形式 FILE * fopen(constchar *path , cost char *mode) /* * description : 打開一個文件 * param ‐ path…

進階篇07——InnoDB引擎介紹

概覽 邏輯存儲結構 架構 當執行增刪改查操作時,操作的是緩沖區的數據,如果緩沖區里沒有要操作的數據,就會從磁盤中讀取數據加載到緩沖區中;緩沖區的數據會以一定的頻率通過后臺線程刷新到磁盤中永久存儲。 內存結構 磁盤結構 后…

數據結構(Java):順序表集合類ArrayList

1、線性表 線性表,在邏輯結構上是連續的(可理解為連續的一條直線,一對一的關系),而在物理結構上不一定連續,通常以數組和鏈式結構進行存儲。 線性表是一種在實際中廣泛使用的數據結構,常見的線…

Vue介紹與入門(一篇入門)

Vue.js 是一個流行的 JavaScript 框架,專門用于構建用戶界面和單頁面應用程序。它簡單易學,但功能強大,能夠幫助開發者快速構建交互性強的 Web 應用。 本教程旨在幫助那些剛開始學習 Vue.js 的開發者快速入門,并掌握一些基礎知識…

【UE5.1 角色練習】12-坐騎——Part2(讓角色騎上坐騎)

目錄 前言 效果 步驟 一、坐騎的父類 二、將角色附加到坐騎 三、添加坐姿 四、騎上坐騎 五、從坐騎上下來 前言 在上一篇(【UE5.1 角色練習】11-坐騎——Part1(控制大象移動))基礎上繼續實現角色騎上坐騎的功能。 效果 …

語言的數據結構:樹與二叉樹(二叉樹篇)

語言的數據結構:樹與二叉樹(二叉樹篇) 前言概念特別的二叉樹滿二叉樹完全二叉樹 存儲結構順序存儲鏈式存儲 查找方式 前言 上文說到了樹,有人認為二叉樹是樹的每一個分支都有兩個子節點。其實這也對。但二叉樹在此基礎上還做了限…

RS422串口通信協議介紹和基礎代碼實現

**RS-422串口協議介紹**RS-422是一種工業標準的通信接口,其全稱是“平衡電壓數字接口電路的電氣特性”。它是在RS-232的基礎上發展而來,旨在解決RS-232通信距離短和速率低的缺點。以下是對RS-422串口協議的詳細介紹:傳輸速率與距離&#xff1…

MyCAT 2 簡單入門

MyCAT 2 基礎 什么是 MyCAT 2? MyCAT 2 是一款開源的數據庫中間件,它主要用于解決數據庫的分庫分表、讀寫分離等問題。MyCAT 2 基于 MyCAT 1 的架構進行優化和重構,具有更高的性能和穩定性,支持多種數據庫類型,包括 …

【QCustomPlot實戰系列】QCPGraph區域高亮

使用QCPDataSelection來設置選中的區域&#xff0c;并將QCPGraph的可選擇區域設置成QCP::stMultipleDataRanges void AreaPieces::initCustomPlot(QCustomPlot *parentPlot) {QVector<double> x {0, 1, 2, 3, 4, 5, 6, 7, 8};QVector<double> y {200, 560, 750…

《mysql篇》--mysql常用命令

數據庫操作 顯示當前數據庫 show databases;(database 后面要加s) 這行命令用來顯示當前有多少個數據庫 //mysql中有自帶的四個庫 創建數據庫 create database 數據庫名(name); 創建一個數據庫 create dabase if not exists <數據庫名(name)>; //如果系統有與當前創建…

前端vite+vue3——利用環境變量和路由區分h5、pc模塊打包(從0到1)

?前言 大家好&#xff0c;我是yma16&#xff0c;本文分享 前端vitevue3——利用環境變量和路由對前端區分h5和pc模塊打包&#xff08;從0到1&#xff09;。 背景&#xff1a; 前端本地開發pc和h5的項目&#xff0c;發布時需要區分開h5和pc的頁面 vite Vite 通過在一開始將應…