Android View知識點面試題集錦 [復制鏈接]

2019-7-30 09:45
Engineers 閱讀:488 評論:0 贊:0
Tag:  Android View

前言

很多人面試之前,可能沒有在互聯網公司工作過或者說工作過但年頭較短,不知道互聯網公司技術面試都會問哪些問題? 再加上可能自己準備也不充分,去面試沒幾個回合就被面試官幾個問題打蒙了,最后以慘敗收場。下述是我整理的Android View知識點面試題匯總。

Android的Activity、PhoneWindow和DecorView的關系可以用下面的圖表示:


Android:View知識點面試題集錦


1.DecorView淺析

例如,有下面一個視圖,DecorView為整個Window界面的最頂層View,它只有一個子元素LinearLayout。代表整個Window界面,包含通知欄、標題欄、內容顯示欄三塊區域。其中LinearLayout中有兩個FrameLayout子元素。


Android:View知識點面試題集錦


DecorView的作用

DecorView是頂級View,本質是一個FrameLayout它包含兩部分,標題欄和內容欄,都是FrameLayout。內容欄id是content,也就是activity中設置setContentView的部分,最終將布局添加到id為content的FrameLayout中。 獲取content:ViewGroup content=findViewById(android.id.content) 獲取設置的View:getChildAt(0).

使用總結

每個Activity都包含一個Window對象,Window對象通常是由PhoneWindow實現的。 PhoneWindow:將DecorView設置為整個應用窗口的根View,是Window的實現類。它是Android中的最基本的窗口系統,每個Activity均會創建一個PhoneWindow對象,是Activity和整個View系統交互的接口。 DecorView:是頂層視圖,將要顯示的具體內容呈現在PhoneWindow上,DecorView是當前Activity所有View的祖先,它并不會向用戶呈現任何東西。

2.View的事件分發

View的事件分發機制可以使用下圖表示:



如上圖,圖分為3層,從上往下依次是Activity、ViewGroup、View。

  1. 事件從左上角那個白色箭頭開始,由Activity的dispatchTouchEvent做分發
  2. 箭頭的上面字代表方法返回值,(return true、return false、return super.xxxxx(),super 的意思是調用父類實現。
  3. dispatchTouchEvent和 onTouchEvent的框里有個【true---->消費】的字,表示的意思是如果方法返回true,那么代表事件就此消費,不會繼續往別的地方傳了,事件終止。
  4. 目前所有的圖的事件是針對ACTION_DOWN的,對于ACTION_MOVE和ACTION_UP我們最后做分析。
  5. 之前圖中的Activity 的dispatchTouchEvent 有誤(圖已修復),只有return super.dispatchTouchEvent(ev) 才是往下走,返回true 或者 false 事件就被消費了(終止傳遞)。

ViewGroup事件分發

當一個點擊事件產生后,它的傳遞過程將遵循如下順序:

Activity -> Window -> View

事件總是會傳遞給Activity,之后Activity再傳遞給Window,最后Window再傳遞給頂級的View,頂級的View在接收到事件后就會按照事件分發機制去分發事件。如果一個View的onTouchEvent返回了FALSE,那么它的父容器的onTouchEvent將會被調用,依次類推,如果所有都不處理這個事件的話,那么Activity將會處理這個事件。

對于ViewGroup的事件分發過程,大概是這樣的:如果頂級的ViewGroup攔截事件即onInterceptTouchEvent返回true的話,則事件會交給ViewGroup處理,如果ViewGroup的onTouchListener被設置的話,則onTouch將會被調用,否則的話onTouchEvent將會被調用,也就是說:兩者都設置的話,onTouch將會屏蔽掉onTouchEvent,在onTouchEvent中,如果設置了onClickerListener的話,那么onClick將會被調用。如果頂級ViewGroup不攔截的話,那么事件將會被傳遞給它所在的點擊事件的子view,這時候子view的dispatchTouchEvent將會被調用

View的事件分發

dispatchTouchEvent -> onTouch(setOnTouchListener) -> onTouchEvent -> onClick

onTouch和onTouchEvent的區別 兩者都是在dispatchTouchEvent中調用的,onTouch優先于onTouchEvent,如果onTouch返回true,那么onTouchEvent則不執行,及onClick也不執行。

3.View的繪制

在xml布局文件中,我們的layout_width和layout_height參數可以不用寫具體的尺寸,而是wrap_content或者是match_parent。這兩個設置并沒有指定真正的大小,可是我們繪制到屏幕上的View必須是要有具體的寬高的,正是因為這個原因,我們必須自己去處理和設置尺寸。當然了,View類給了默認的處理,但是如果View類的默認處理不滿足我們的要求,我們就得重寫onMeasure函數啦~。

onMeasure函數是一個int整數,里面放了測量模式和尺寸大小。int型數據占用32個bit,而google實現的是,將int數據的前面2個bit用于區分不同的布局模式,后面30個bit存放的是尺寸的數據。 onMeasure函數的使用如下圖:


Android:View知識點面試題集錦


MeasureSpec有三種測量模式:


Android:View知識點面試題集錦


match_parent—>EXACTLY。怎么理解呢?match_parent就是要利用父View給我們提供的所有剩余空間,而父View剩余空間是確定的,也就是這個測量模式的整數里面存放的尺寸。

wrap_content—>AT_MOST。怎么理解:就是我們想要將大小設置為包裹我們的view內容,那么尺寸大小就是父View給我們作為參考的尺寸,只要不超過這個尺寸就可以啦,具體尺寸就根據我們的需求去設定。

固定尺寸(如100dp)—>EXACTLY。用戶自己指定了尺寸大小,我們就不用再去干涉了,當然是以指定的大小為主啦。


Android:View知識點面試題集錦


Android:View知識點面試題集錦


4.ViewGroup的繪制

自定義ViewGroup可就沒那么簡單啦~,因為它不僅要管好自己的,還要兼顧它的子View。我們都知道ViewGroup是個View容器,它裝納child View并且負責把child View放入指定的位置。

  1. 首先,我們得知道各個子View的大小吧,只有先知道子View的大小,我們才知道當前的ViewGroup該設置為多大去容納它們。
  2. 根據子View的大小,以及我們的ViewGroup要實現的功能,決定出ViewGroup的大小
  3. ViewGroup和子View的大小算出來了之后,接下來就是去擺放了吧,具體怎么去擺放呢?這得根據你定制的需求去擺放了,比如,你想讓子View按照垂直順序一個挨著一個放,或者是按照先后順序一個疊一個去放,這是你自己決定的。
  4. 已經知道怎么去擺放還不行啊,決定了怎么擺放就是相當于把已有的空間”分割”成大大小小的空間,每個空間對應一個子View,我們接下來就是把子View對號入座了,把它們放進它們該放的地方去。


Android:View知識點面試題集錦


Android:View知識點面試題集錦



我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

时时彩改欢乐生肖