【移動應(yīng)用開發(fā)技術(shù)】關(guān)于Andorid View的種種這里告訴你答案_第1頁
【移動應(yīng)用開發(fā)技術(shù)】關(guān)于Andorid View的種種這里告訴你答案_第2頁
【移動應(yīng)用開發(fā)技術(shù)】關(guān)于Andorid View的種種這里告訴你答案_第3頁
【移動應(yīng)用開發(fā)技術(shù)】關(guān)于Andorid View的種種這里告訴你答案_第4頁
【移動應(yīng)用開發(fā)技術(shù)】關(guān)于Andorid View的種種這里告訴你答案_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】關(guān)于AndoridView的種種,這里告訴你答案

大廠除了技術(shù)深度之外,還要求你具備一些廣度的知識,比如你要會前端知識,會混合開發(fā),至少會一種腳本語言,Cc++更不用說了,也是必會的。為此我吧這些知識整理成了一個983的PDF,從基礎(chǔ)到進(jìn)階。含有BATJ.字節(jié)跳動面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識,到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)可以點(diǎn)擊關(guān)于我聯(lián)系我獲取完整PDF(VX:×××)

1.Hybrid做過嗎?2.Hybrid通信原理是什么,有做研究嗎?3.reactnative有多少了解?講一下原理。4.weex了解嗎?如何自己實(shí)現(xiàn)類似技術(shù)?5.flutter了解嗎?內(nèi)部是如何實(shí)現(xiàn)跨平臺的?6.Dart語言有研究貴嗎?7.快應(yīng)用了解嗎?跟其她方式相比有什么優(yōu)缺點(diǎn)?8.說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點(diǎn)?9.Python會嗎?10.會不會PHP?11.Gradle了解多少?groovy語法會嗎?

1.Hybrid做過嗎?2.Hybrid通信原理是什么,有做研究嗎?3.reactnative有多少了解?講一下原理。4.weex了解嗎?如何自己實(shí)現(xiàn)類似技術(shù)?5.flutter了解嗎?內(nèi)部是如何實(shí)現(xiàn)跨平臺的?6.Dart語言有研究貴嗎?7.快應(yīng)用了解嗎?跟其她方式相比有什么優(yōu)缺點(diǎn)?8.說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點(diǎn)?9.Python會嗎?10.會不會PHP?11.Gradle了解多少?groovy語法會嗎?AndroidView總結(jié)a)layout(left,top,right,bottom):通過修改View四個方向的屬性值來修改View的坐標(biāo),從而滑動Viewb)offsetLeftAndRight()offsetTopAndBottom():指定偏移量滑動viewc)LayoutParams,改變布局參數(shù):layoutParams中保存了view的布局參數(shù),可以通過修改布局參數(shù)的方式滑動viewd)通過動畫來移動view:注意安卓的平移動畫不能改變view的位置參數(shù),屬性動畫可以e)scrollTo/scrollBy:注意移動的是view的內(nèi)容,scrollBy(50,50)你會看到屏幕上的內(nèi)容向屏幕的左上角移動了,這是參考對象不同導(dǎo)致的,你可以看作是它移動的是手機(jī)屏幕,手機(jī)屏幕向右下角移動,那么屏幕上的內(nèi)容就像左上角移動了f)scroller:scroller需要配置computeScroll方法實(shí)現(xiàn)view的滑動,scroller本身并不會滑動view,它的作用可以看作一個插值器,它會計算當(dāng)前時間點(diǎn)view應(yīng)該滑動到的距離,然后view不斷的重繪,不斷的調(diào)用computeScroll方法,這個方法是個空方法,所以我們重寫這個方法,在這個方法中不斷的從scroller中獲取當(dāng)前view的位置,調(diào)用scrollTo方法實(shí)現(xiàn)滑動的效果點(diǎn)擊事件產(chǎn)生后,首先傳遞給Activity的dispatchTouchEvent方法,通過PhoneWindow傳遞給DecorView,然后再傳遞給根ViewGroup,進(jìn)入ViewGroup的dispatchTouchEvent方法,執(zhí)行onInterceptTouchEvent方法判斷是否攔截,再不攔截的情況下,此時會遍歷ViewGroup的子元素,進(jìn)入子View的dispatchToucnEvent方法,如果子view設(shè)置了onTouchListener,就執(zhí)行onTouch方法,并根據(jù)onTouch的返回值為true還是false來決定是否執(zhí)行onTouchEvent方法,如果是false則繼續(xù)執(zhí)行onTouchEvent,在onTouchEvent的ActionUp事件中判斷,如果設(shè)置了onClickListener,就執(zhí)行onClick方法。View隨著Activity的創(chuàng)建而加載,startActivity啟動一個Activity時,在ActivityThread的handleLaunchActivity方法中會執(zhí)行Activity的onCreate方法,這個時候會調(diào)用setContentView加載布局創(chuàng)建出DecorView并將我們的layout加載到DecorView中,當(dāng)執(zhí)行到handleResumeActivity時,Activity的onResume方法被調(diào)用,然后WindowManager會將DecorView設(shè)置給ViewRootImpl,這樣,DecorView就被加載到Window中了,此時界面還沒有顯示出來,還需要經(jīng)過View的measure,layout和draw方法,才能完成View的工作流程。我們需要知道View的繪制是由ViewRoot來負(fù)責(zé)的,每一個DecorView都有一個與之關(guān)聯(lián)的ViewRoot,這種關(guān)聯(lián)關(guān)系是由WindowManager維護(hù)的,將DecorView和ViewRoot關(guān)聯(lián)之后,ViewRootImpl的requestLayout會被調(diào)用以完成初步布局,通過scheduleTraversals方法向主線程發(fā)送消息請求遍歷,最終調(diào)用ViewRootImpl的performTraversals方法,這個方法會執(zhí)行View的measurelayout和draw流程在上邊的分析中我們知道,View繪制流程的入口在ViewRootImpl的performTraversals方法,在方法中首先調(diào)用performMeasure方法,傳入一個childWidthMeasureSpec和childHeightMeasureSpec參數(shù),這兩個參數(shù)代表的是DecorView的MeasureSpec值,這個MeasureSpec值由窗口的尺寸和DecorView的LayoutParams決定,最終調(diào)用View的measure方法進(jìn)入測量流程measure:View的measure過程由ViewGroup傳遞而來,在調(diào)用View.measure方法之前,會首先根據(jù)View自身的LayoutParams和父布局的MeasureSpec確定子view的MeasureSpec,然后將view寬高對應(yīng)的measureSpec傳遞到measure方法中,那么子view的MeasureSpec獲取規(guī)則是怎樣的?分幾種情況進(jìn)行說明1.父布局是EXACTLY模式:2.父布局是AT_MOST模式:3.父布局是UNSPECIFIED模式:獲取到寬高的MeasureSpec后,傳入view的measure方法中來確定view的寬高,這個時候還要分情況

1.當(dāng)MeasureSpec的mode是UNSPECIFIED,此時view的寬或者高要看view有沒有設(shè)置背景,如果沒有設(shè)置背景,就返回設(shè)置的minWidth或minHeight,這兩個值如果沒有設(shè)置默認(rèn)就是0,如果view設(shè)置了背景,就取minWidth或minHeight和背景這個drawable固有寬或者高中的最大值返回2.當(dāng)MeasureSpec的mode是AT_MOST和EXACTLY,此時view的寬高都返回從MeasureSpec中獲取到的size值,這個值的確定見上邊的分析。因此如果要通過繼承view實(shí)現(xiàn)自定義view,一定要重寫onMeasure方法對wrap_conten屬性做處理,否則,他的match_parent和wrap_content屬性效果就是一樣的

1.當(dāng)MeasureSpec的mode是UNSPECIFIED,此時view的寬或者高要看view有沒有設(shè)置背景,如果沒有設(shè)置背景,就返回設(shè)置的minWidth或minHeight,這兩個值如果沒有設(shè)置默認(rèn)就是0,如果view設(shè)置了背景,就取minWidth或minHeight和背景這個drawable固有寬或者高中的最大值返回2.當(dāng)MeasureSpec的mode是AT_MOST和EXACTLY,此時view的寬高都返回從MeasureSpec中獲取到的size值,這個值的確定見上邊的分析。因此如果要通過繼承view實(shí)現(xiàn)自定義view,一定要重寫onMeasure方法對wrap_conten屬性做處理,否則,他的match_parent和wrap_content屬性效果就是一樣的layout:layout方法的作用是用來確定view本身的位置,onLayout方法用來確定所有子元素的位置,當(dāng)ViewGroup的位置確定之后,它在onLayout中會遍歷所有的子元素并調(diào)用其layout方法,在子元素的layout方法中onLayout方法又會被調(diào)用。layout方法的流程是,首先通過setFrame方法確定view四個頂點(diǎn)的位置,然后view在父容器中的位置也就確定了,接著會調(diào)用onLayout方法,確定子元素的位置,onLayout是個空方法,需要繼承者去實(shí)現(xiàn)。getMeasuredHeight和getHeight方法有什么區(qū)別?getMeasuredHeight(測量高度)形成于view的measure過程,getHeight(最終高度)形成于layout過程,在有些情況下,view需要measure多次才能確定測量寬高,在前幾次的測量過程中,得出的測量寬高有可能和最終寬高不一致,但是最終來說,還是會相同,有一種情況會導(dǎo)致兩者值不一樣,如下,此代碼會導(dǎo)致view的最終寬高比測量寬高大100px

publicvoidlayout(intl,intt,intr,intb){

super.layout(l,t,r+100,b+100);}

draw:View的繪制過程遵循如下幾步:

a.繪制背景background.draw(canvas)b.繪制自己(onDraw)c.繪制children(dispatchDraw)d.繪制裝飾(onDrawScrollBars)

a.繪制背景background.draw(canvas)b.繪制自己(onDraw)c.繪制children(dispatchDraw)d.繪制裝飾(onDrawScrollBars)View繪制過程的傳遞是通過dispatchDraw來實(shí)現(xiàn)的,它會遍歷所有的子元素的draw方法,如此draw事件就一層一層的傳遞下去了ps:view有一個特殊的方法setWillNotDraw,如果一個view不需要繪制內(nèi)容,即不需要重寫onDraw方法繪制,可以開啟這個標(biāo)記,系統(tǒng)會進(jìn)行相應(yīng)的優(yōu)化。默認(rèn)情況下,View沒有開啟這個標(biāo)記,默認(rèn)認(rèn)為需要實(shí)現(xiàn)onDraw方法繪制,當(dāng)我們繼承ViewGroup實(shí)現(xiàn)自定義控件,并且明確知道不需要具備繪制功能時,可以開啟這個標(biāo)記,如果我們重寫了onDraw,那么要顯示的關(guān)閉這個標(biāo)記子view寬高可以超過父view?能1)讓view支持wrap_content屬性,在onMeasure方法中針對AT_MOST模式做專門處理,否則wrap_content會和match_parent效果一樣(繼承ViewGroup也同樣要在onMeasure中做這個判斷處理)if(widthMeasureSpec==MeasureSpec.AT_MOST&&heightMeasureSpec==MeasureSpec.AT_MOST){

setMeasuredDimension(200,200);//wrap_content這種情況下要設(shè)置一個默認(rèn)值,200只是舉個例子,最終的值需要計算得到剛好包裹內(nèi)容的寬高值}elseif(widthMeasureSpec==MeasureSpec.AT_MOST){

setMeasuredDimension(200,heightMeasureSpec);

}elseif(heightMeasureSpec==MeasureSpec.AT_MOST){

setMeasuredDimension(heightMeasureSpec,200);

}2)讓view支持padding(onDraw的時候,寬高減去paddi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論