(面試)View相關知識

1、View繪制流程

  • onMeasure() 確定View的測量寬高。
  • onLayout() 確定View的最終寬高四個頂點的位置。
  • onDraw() 將View?繪制到屏幕上。

2、MeasureSpec有三種測量模式:

2.1.?EXACTLY(精確模式)

  • 含義:父容器明確指定了子View的精確尺寸,子View必須使用該尺寸
  • 典型場景:
    • 布局中設置了固定值(如android:layout_width="100dp")。
    • View的寬/高設置為match_parent,且父容器有確定尺寸。
  • View行為:必須直接使用MeasureSpec中的size作為最終尺寸。

2.2.?AT_MOST(最大模式)

  • 含義:父容器指定了子View的最大可用尺寸,子View的尺寸不能超過該值,但可以更小

  • 典型場景:

    • View的寬/高設置為wrap_content

    • 父容器為ScrollViewRecyclerView等可滾動的容器。

  • View行為:根據自身內容計算尺寸,但最終尺寸不能超過MeasureSpec中的size


2.3.?UNSPECIFIED(未指定模式)

  • 含義:父容器對子View無任何約束,子View可以自由決定尺寸(通常根據自身邏輯或內容)
  • 典型場景:
    • 自定義ViewViewGroup需要多次測量(如ListView測量子View的高度)。
    • 系統內部測量(如ScrollView在測量子View的滾動范圍時)。
  • View行為:完全由自身決定尺寸(可能使用默認值或內容所需尺寸)。

3、事件分發機制

3.1 事件分發:dispatchTouchEvent

用來進行事件的分發,如果事件能夠傳遞給當前View,則該方法一定會被調用。返回結果受當前View的onTouchEvent和下級的dispatchTouchEvent的影響,表示是否消耗當前事件。

原型:public boolean dispatchTouchEvent(MotionEvent ev)

return:

  • ture:當前View消耗所有事件
  • false:停止分發,交由上層控件的onTouchEvent方法進行消費,如果本層控件是Activity,則事件將被系統消費,處理

3.2?事件攔截:onInterceptTouchEvent

需注意的是在Activity,ViewGroup,View中只有ViewGroup有這個方法。故一旦有點擊事件傳遞給View,則View的onTouchEvent方法就會被調用

在dispatchTouchEvent內部使用,用來判斷是否攔截事件。如果當前View攔截了某個事件,那么該事件序列的其它方法也由當前View處理,故該方法不會被再次調用,因為已經無須詢問它是否要攔截該事件。

原型:public boolean onInterceptTouchEvent(MotionEvent ev)

return:

  • ture:對事件攔截,交給本層的onTouchEvent進行處理
  • false:不攔截,分發到子View,由子View的dispatchTouchEvent進行處理
  • super.onInterceptTouchEvent(ev):默認不攔截

3.3 事件處理:onTouchEvent

在dispatchTouchEvent中調用,用來處理點擊事件,返回結果表示是否消耗當前事件,如果不消耗,則在同一事件序列中,當前View無法再接受到剩下的事件,并且事件將重新交給它的父元素處理,即父元素的onTouchEvent會被調用

原型:public boolean onTouchEvent(MotionEvent ev)

return:

  • true:表示onTouchEvent處理后消耗了當前事件
  • false:不響應事件,不斷的傳遞給上層的onTouchEvent方法處理,直到某個View的onTouchEvent返回true,則認為該事件被消費,如果到最頂層View還是返回false,則該事件不消費,將交由Activity的onTouchEvent處理。
  • super.onTouchEvent(ev):默認消耗當前事件,與返回true一致。

事件分發機制總結:

在分析事件分發機制時,應該從事件分發的順序入手一步一步解剖。從上文我們知道事件分發順序為:Activity->Window->DecorView->ViewGroup->View。由于Window與DecorView可以看作是Activity->ViewGroup的過程,故這里將從三部分通過源碼來分析事件分發機制:

  1. Activity對點擊事件的分發機制
  2. ViewGroup對點擊事件的分發機制
  3. View對點擊事件的分發機制
  • 當一個點擊事件發生后,總是先傳遞給當前的Activity,由Activity的dispatchTouchEvent進行分發,而Activity會將事件傳遞給Window,然后由Window的唯一實現類PhoneWindow將事件傳遞給DecorView,接著DecorView將事件傳遞給自己的父類ViewGroup,此時的ViewGroup就是通過setContentView所設置的View,故可以稱為頂級View,這時候ViewGroup可能是自己處理該事件或者傳遞給子View,但是最終都會調用View的dispatchTouchEvent來處理事件。
  • 在View的dispatchTouchEvent中,如果設置了onTouchListener,會調用其onTouch方法,如果onTouch返回true,則不再調用onTouchEvent。如果有設置點擊事件,則在onTouchEvent會調用onClick方法。如果子View的onTouchEvent返回了false,則表示不消耗事件,事件會回傳給上一級的ViewGroup的onTouchEvent,如果所有的ViewGroup都沒有返回true,則最終會回傳到Activity的onTouchEvent。

4、requestLayout(), invalidate(), postInvalidate() 方法區別

requestLayout方法只會導致當前view的measure和layout,而draw不一定被執行,只有當view的位置發生改變才會執行draw方法,因此如果要使當前view重繪需要調用invalidate。

invalidate在UI線程中調用,postInvalidate在非UI線程中調用。因為android的UI線程是非線程安全的,所以在非UI線程中,需要使用postInvalidate來使View重繪。view調用invalidate將導致當前view的重繪(draw調用),view的父類將不會執行draw方法viewGroup調用invalidate會使viewGroup的子view調用draw,也就是viewGroup內部的子view進行重繪

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

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

相關文章

數組名既可作為指針也可作為變量名

在C語言中,數組名在不同的上下文中既可以作為指向數組首個元素的指針,也可以代表整個數組,這是由C語言的設計和語法規則決定的,下面我來詳細解釋一下。 1. 數組名作為指向首元素的指針 在大多數情況下,當數組名出現在…

Java異常、泛型與集合框架實戰:從基礎到應用

在Java編程的世界里,異常處理、泛型和集合框架是構建高效、健壯應用的關鍵技術。通過掌握這些技術,我們可以更好地管理程序運行時的錯誤,提高代碼的復用性和類型安全性。今天,我將通過一系列實驗,分享如何在Java中使用…

Spring源碼之解決循環依賴 三級緩存

目錄 三級緩存核心原理 循環依賴的解決過程 1. Bean A創建過程中提前曝光工廠 2. Bean B創建時發現依賴A,從緩存獲取 3. Bean A繼續完成初始化 三級緩存的作用總結 二級緩存為何不夠解決緩存依賴? 三級緩存如何解決? 為什么不直接在…

K8S Ingress 實現AB測試、藍綠發布、金絲雀(灰度)發布

假設有如下三個節點的 K8S 集群: ? k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、場景分析 閱讀本文,默認您已經安裝了 Ingress Nginx。 1)A/B 測試 A/B 測試基于用戶請求的元信息將流量路由…

深入理解構造函數,析構函數

目錄 1.引言 2.構造函數 1.概念 2.特性 3.析構函數 1.概念 2.特性 1.引言 如果一個類中什么都沒有,叫作空類. class A {}; 那么我們這個類中真的是什么都沒有嗎?其實不是,如果我們類當中上面都不寫.編譯器會生成6個默認的成員函數。 默認成員函數:用戶沒有顯…

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接

Oracle 11.2.0.4 pre PSU Oct18 設置SSL連接 1 說明2 客戶端配置jdk環境3服務器檢查oracle數據庫補丁4設置ssla 服務器配置walletb 上傳測試腳本和配置文件到客戶端c 服務器修改數據庫偵聽和sqlnet.orad 修改客戶端的sqlnet.ora和tnsnames.ora的連接符e 修改java代碼的數據連接…

BrepGen中的幾何特征組裝與文件保存詳解 deepwiki occwl OCC包裝庫

有這種好東西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 組裝幾何特征以創建B-rep模型 保存為STEP和STL文件細說 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重慶 ICPC 比賽游記

2025.5.9 比賽前一天晚上,激動地睡不著覺,起來收拾了好多東西。(其實就四本書,剩下的全是零食……關鍵在于這四本書基本沒用。) 2025.5.10 學校喪心病狂的讓我們 6:20 到校門口集合坐車(據說是怕趕不上比…

0x08.Redis 支持事務嗎?如何實現?

回答重點 Redis 支持事務,但它的事務與 MySQL 等關系型數據庫的事務有著本質區別。MySQL 中的事務嚴格遵循 ACID 特性,而 Redis 中的事務主要保證的是命令執行的原子性和隔離性,即所有命令在一個不可分割的操作中順序執行,不會被其他客戶端的命令請求所打斷。 最關鍵的區…

佰力博科技與您探討表面電阻的測試方法及應用領域

表面電阻測試是一種用于測量材料表面電阻值的技術,廣泛應用于評估材料的導電性能、靜電防護性能以及絕緣性能。 1、表面電阻的測試測試方法: 表面電阻測試通常采用平行電極法、同心圓電極法和四探針法等方法進行。其中,平行電極法通過在試樣…

數據庫的規范化設計方法---3種范式

第一范式(1NF):確保表中的每個字段都是不可分割的基本數據項。 第二范式(2NF):在滿足1NF的基礎上,確保非主屬性完全依賴于主鍵。 第三范式(3NF):在滿足2NF的基…

產品經理入門(2)產品體驗報告

產品體驗報告大綱:重點在產品體驗——優點。 1.產品概括 可以從各大平臺搜產品介紹。 2.市場分析 按照產品方向分析各個指標——包括有效使用時間,市場規模等。 3. 用戶分析——對用戶通過各項指標畫像。 4.產品體驗——對各項功能與設計的體驗。 5.報告總結

[Java][Leetcode simple] 13. 羅馬數字轉整數

一、自己想的 只有提到的六種情況是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虛擬機上配置靜態 IP 地址并保持重啟后 SSH 連接

在使用 CentOS 7 的虛擬機時&#xff0c;我們通常需要配置靜態 IP 地址&#xff0c;以確保在每次虛擬機重啟后能夠通過 SSH 連接。本文將介紹如何在 CentOS 7 系統中配置靜態 IP 地址&#xff0c;并確保配置在系統重啟后依然生效。 步驟 1&#xff1a;檢查虛擬機網絡接口 首先…

matlab求解問題

一、目的 掌握Matlab中函數求導、函數極值和極限問題的求解,能夠借助Matlab工具對簡單優化模型進行求解。 二、內容與設計思想 1、函數求導 1.1求解給定函數的一階導數&#xff1a;diff(y, x)用于對變量x求y的導數。 1.2求解給定函數的二階導數&#xff1a;在求出一階導數的…

C語言斐波那契數列

斐波那契數列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又稱黃金分割數列 、兔子數列。由意大利數學家萊昂納多?斐波那契在 1202 年提出&#xff0c;源于其《算盤書》中一道兔子繁殖問題。定義&#xff1a;在數學上&#xff0c;該數列以遞歸形式定義。最常見的是…

AI浪潮:開啟科技新紀元

AI 的多面應用? AI 的影響力早已突破實驗室的圍墻&#xff0c;在眾多領域落地生根&#xff0c;成為推動行業變革的重要力量。 在醫療領域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力醫生提升診療效率與準確性。通過對海量醫學影像的深度學習&#xff0c;AI 能夠快…

Ansys 計算剛柔耦合矩陣系數

Ansys 計算剛柔耦合系數矩陣 文章目錄 Ansys 計算剛柔耦合系數矩陣衛星的剛柔耦合動力學模型采用 ANSYS 的 APDL 語言的計算方法系統轉動慣量的求解方法參考文獻 衛星的剛柔耦合動力學模型 柔性航天器的剛柔耦合動力學模型可以表示為 m v ˙ B t r a n η F J ω ˙ ω J…

算法題(148):排座椅

審題&#xff1a; 本題需要我們找到最佳的排座椅方案&#xff0c;并輸出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;簡單貪心 由于題目會告訴我們有哪幾對的同學會交頭接耳&#xff0c;所以我們可以記錄下第幾行/第幾列上可以隔開的同學對數&#xff0c;而題目限…

企業級電商數據對接:1688 商品詳情 API 接口開發與優化實踐

在數字化浪潮席卷全球的當下&#xff0c;企業級電商平臺之間的數據對接已成為提升運營效率、增強市場競爭力的關鍵環節。作為國內知名的 B2B 電商平臺&#xff0c;1688 擁有海量商品資源&#xff0c;通過開發和優化商品詳情 API 接口&#xff0c;企業能夠快速獲取商品信息&…