Android面試 UI相關(guān)

面試問題

  • onMeasure onLayout onDraw的作用
  • 自定義View和自定義ViewGroup的區(qū)別
  • getMeasureWidth和getWidth的區(qū)別
  • getLeft getRight getWidth表示的意義
  • MeasureSpec是什么
  • 如何優(yōu)化自定義View
  • 自定義view效率高于xml定義嗎
  • Draw的基本流程
  • setWillNotDraw的作用
  • invalidate()列牺、postInvalidate()变过、requestLayout()的區(qū)別

onMeasure onLayout onDraw的作用

  • onMeasure:用來計算控件的尺寸叙赚,告訴父控件此控件需要的尺寸。
  • onLayout:父容器的onLayout()調(diào)用子類的layout()來確定子view在viewGroup中的位置燎竖。
  • onDraw:自定義view的關(guān)鍵方法,用于繪制界面,可以重寫此方法以繪制自定義View驳遵。

自定義View和自定義ViewGroup的區(qū)別

  • ViewGroup是一個容器怨喘,而這個容器是繼承與View津畸。
  • ViewGroup是一個基類,并且是Layout和一些View組件的基類必怜。

getMeasureWidth和getWidth的區(qū)別

  • getMeasureWidth()在走完onMeasure()方法之后有值
  • getWidth()在layout()之后有值,是布局完成之后的確切值
  • getMeasureWidth()在onMeasure()之后調(diào)用
  • getWidth()在layout()之后調(diào)用
  • getMeasureWidth()是view的一個測量大小
  • getWidth()是view被父布局擺放的大小

getLeft getRight getWidth表示的意義

getWidth()的值就是getRight()-getLeft()的值肉拓。

MeasureSpec是什么

從MeasureSpec類的定義我們知道,它封裝了對子View的布局要求梳庆,由尺寸和模式組成暖途,其實MeasureSpec代表一個32位的int值,高2位表示SpecMode膏执,低30位表示SpecSize,而SpecSize是指在某種SpecMode下的規(guī)格大小驻售,從源碼我們看出它內(nèi)部定義了很多常量,從api17以后開始采用位運算更米,因為位運算的效率最高欺栗,我們看下三種模式:
UNSPECIFIED:未指定模式,不對View大小做限制,如:ListView迟几,ScrollView消请。
EXACTLY:精確模式,確切的大小类腮,如:100dp或者march_parent臊泰。
AT_MOST:最大模式,大小不可超過某數(shù)值蚜枢,如:wrap_content缸逃。

如何優(yōu)化自定義View

為了加速你的view,對于頻繁調(diào)用的方法祟偷,需要盡量減少不必要的代碼察滑。先從onDraw開始,需要特別注意不應(yīng)該在這里做內(nèi)存分配的事情修肠,因為它會導(dǎo)致GC贺辰,從而導(dǎo)致卡頓。在初始化或者動畫間隙期間做分配內(nèi)存的動作嵌施。不要在動畫正在執(zhí)行的時候做內(nèi)存分配的事情饲化。
你還需要盡可能的減少onDraw被調(diào)用的次數(shù),大多數(shù)時候?qū)е耾nDraw都是因為調(diào)用了invalidate()吗伤,因此請盡量減少調(diào)用invaildate()的次數(shù)吃靠。如果可能的話,盡量調(diào)用含有4個參數(shù)的invalidate()方法而不是沒有參數(shù)的invalidate()足淆。沒有參數(shù)的invalidate會強制重繪整個view巢块。
另外一個非常耗時的操作是請求layout。任何時候執(zhí)行requestLayout()巧号,會使得Android UI系統(tǒng)去遍歷整個View的層級來計算出每一個view的大小族奢。如果找到有沖突的值,它會需要重新計算好幾次丹鸿。另外需要盡量保持View的層級是扁平化的越走,這樣對提高效率很有幫助。
如果你有一個復(fù)雜的UI靠欢,你應(yīng)該考慮寫一個自定義的ViewGroup來執(zhí)行他的layout操作廊敌。與內(nèi)置的view不同,自定義的view可以使得程序僅僅測量這一部分门怪,這避免了遍歷整個view的層級結(jié)構(gòu)來計算大小骡澈。

自定義view效率高于xml定義嗎

自定義view效率高于xml定義:

  1. 少了解析xml。
  2. 自定義View減少了ViewGroup與View之間的測量薪缆,包括父量子秧廉,子量自身伞广,子在父中位置擺放,當(dāng)子view變化時疼电,父的某些屬性都會跟著變化嚼锄。

Draw的基本流程

繪制基本上可以分為六個步驟:

  • 首先繪制View的背景;
  • 如果需要的話蔽豺,保持canvas的圖層区丑,為fading做準(zhǔn)備;
  • 然后修陡,繪制View的內(nèi)容沧侥;
  • 接著,繪制View的子View魄鸦;
  • 如果需要的話宴杀,繪制View的fading邊緣并恢復(fù)圖層;
  • 最后拾因,繪制View的裝飾(例如滾動條等等)旺罢。

setWillNotDraw的作用

如果一個View不需要繪制任何內(nèi)容,那么設(shè)置這個標(biāo)記位為true以后绢记,系統(tǒng)會進行相應(yīng)的優(yōu)化扁达。

  • 默認情況下,View沒有啟用這個優(yōu)化標(biāo)記位蠢熄,但是ViewGroup會默認啟用這個優(yōu)化標(biāo)記位跪解。
  • 當(dāng)我們的自定義控件繼承于ViewGroup并且本身不具備繪制功能時,就可以開啟這個標(biāo)記位從而便于系統(tǒng)進行后續(xù)的優(yōu)化签孔。
  • 當(dāng)明確知道一個ViewGroup需要通過onDraw來繪制內(nèi)容時叉讥,我們需要顯示地關(guān)閉WILL_NOT_DRAW這個標(biāo)記位。

invalidate()饥追、postInvalidate()节吮、requestLayout()的區(qū)別

  • invalidate()與postInvalidate()都用于刷新View,主要區(qū)別是invalidate()在主線程中調(diào)用判耕,若在子線程中使用需要配合handler;而postInvalidate()可在子線程中直接調(diào)用翘骂。
  • invalidate()和postInvalidate():View(非容器類)調(diào)用invalidate方法只會重繪自身壁熄,ViewGroup調(diào)用則會重繪整個View樹。
  • requestLayout:View執(zhí)行requestLayout方法碳竟,會向上遞歸到頂級父View中草丧,再執(zhí)行這個頂級父View的requestLayout,所以其他View的onMeasure莹桅,onLayout也可能會被調(diào)用昌执。

更多內(nèi)容戳這里(整理好的各種文集)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末烛亦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子懂拾,更是在濱河造成了極大的恐慌煤禽,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖赋,死亡現(xiàn)場離奇詭異檬果,居然都是意外死亡,警方通過查閱死者的電腦和手機唐断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門选脊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脸甘,你說我怎么就攤上這事恳啥。” “怎么了丹诀?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵钝的,是天一觀的道長。 經(jīng)常有香客問我忿墅,道長扁藕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任疚脐,我火速辦了婚禮亿柑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘棍弄。我一直安慰自己望薄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布呼畸。 她就那樣靜靜地躺著痕支,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛮原。 梳的紋絲不亂的頭發(fā)上卧须,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音儒陨,去河邊找鬼花嘶。 笑死,一個胖子當(dāng)著我的面吹牛蹦漠,可吹牛的內(nèi)容都是我干的椭员。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笛园,長吁一口氣:“原來是場噩夢啊……” “哼隘击!你這毒婦竟也來了侍芝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤埋同,失蹤者是張志新(化名)和其女友劉穎州叠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莺禁,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡留量,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了哟冬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楼熄。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖浩峡,靈堂內(nèi)的尸體忽然破棺而出可岂,到底是詐尸還是另有隱情,我是刑警寧澤翰灾,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布缕粹,位于F島的核電站,受9級特大地震影響纸淮,放射性物質(zhì)發(fā)生泄漏平斩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一咽块、第九天 我趴在偏房一處隱蔽的房頂上張望绘面。 院中可真熱鬧,春花似錦侈沪、人聲如沸揭璃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瘦馍。三九已至,卻和暖如春应役,著一層夾襖步出監(jiān)牢的瞬間情组,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工箩祥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呻惕,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓滥比,卻偏偏與公主長得像,于是被迫代替她去往敵國和親做院。 傳聞我的和親對象是個殘疾皇子盲泛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容