大廠除了技術(shù)深度之外,還要求你具備一些廣度的知識(shí),比如你要會(huì)前端知識(shí),會(huì)混合開(kāi)發(fā),至少會(huì)一種腳本語(yǔ)言,C c++更不用說(shuō)了,也是必會(huì)的。
目前成都創(chuàng)新互聯(lián)公司已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、左云網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。為此我吧這些知識(shí)整理成了一個(gè)983的PDF,從基礎(chǔ)到進(jìn)階。含有BATJ.字節(jié)跳動(dòng)面試專題,算法專題,高端技術(shù)專題,混合開(kāi)發(fā)專題,java面試專題,Android,Java小知識(shí),到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記
(更多完整項(xiàng)目下載。未完待續(xù)。源碼。圖文知識(shí)后續(xù)上傳github。)
可以點(diǎn)擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)
1.Hybrid做過(guò)嗎?
2.Hybrid通信原理是什么,有做研究嗎?
3.react native有多少了解?講一下原理。
4.weex了解嗎?如何自己實(shí)現(xiàn)類似技術(shù)?
5.flutter了解嗎??jī)?nèi)部是如何實(shí)現(xiàn)跨平臺(tái)的?
6.Dart語(yǔ)言有研究貴嗎?
7.快應(yīng)用了解嗎?跟其她方式相比有什么優(yōu)缺點(diǎn)?
8.說(shuō)說(shuō)你用過(guò)的混合開(kāi)發(fā)技術(shù)有哪些?各有什么優(yōu)缺點(diǎn)?
9.Python會(huì)嗎?
10.會(huì)不會(huì)PHP?
11.Gradle了解多少?groovy語(yǔ)法會(huì)嗎?
a)layout(left,top,right,bottom):通過(guò)修改View四個(gè)方向的屬性值來(lái)修改View的坐標(biāo),從而滑動(dòng)View
b)offsetLeftAndRight() offsetTopAndBottom():指定偏移量滑動(dòng)view
c )LayoutParams,改變布局參數(shù):layoutParams中保存了view的布局參數(shù),可以通過(guò)修改布局參數(shù)的方式滑動(dòng)view
d )通過(guò)動(dòng)畫(huà)來(lái)移動(dòng)view:注意安卓的平移動(dòng)畫(huà)不能改變view的位置參數(shù),屬性動(dòng)畫(huà)可以
e )scrollTo/scrollBy
:注意移動(dòng)的是view的內(nèi)容,scrollBy
(50,50)你會(huì)看到屏幕上的內(nèi)容向屏幕的左上角移動(dòng)了,這是參考對(duì)象不同導(dǎo)致的,你可以看作是它移動(dòng)的是手機(jī)屏幕,手機(jī)屏幕向右下角移動(dòng),那么屏幕上的內(nèi)容就像左上角移動(dòng)了
f )scroller:scroller
需要配置computeScroll
方法實(shí)現(xiàn)view的滑動(dòng),scroller
本身并不會(huì)滑動(dòng)view,它的作用可以看作一個(gè)插值器,它會(huì)計(jì)算當(dāng)前時(shí)間點(diǎn)view應(yīng)該滑動(dòng)到的距離,然后view不斷的重繪,不斷的調(diào)用computeScroll
方法,這個(gè)方法是個(gè)空方法,所以我們重寫(xiě)這個(gè)方法,在這個(gè)方法中不斷的從scroller
中獲取當(dāng)前view的位置,調(diào)用scrollTo方法實(shí)現(xiàn)滑動(dòng)的效果
點(diǎn)擊事件產(chǎn)生后,首先傳遞給Activity的dispatchTouchEvent
方法,通過(guò)PhoneWindow
傳遞給DecorView
,然后再傳遞給根ViewGroup
,進(jìn)入ViewGroup
的dispatchTouchEvent
方法,執(zhí)行onInterceptTouchEvent
方法判斷是否攔截,再不攔截的情況下,此時(shí)會(huì)遍歷ViewGroup
的子元素,進(jìn)入子View的dispatchToucnEvent
方法,如果子view設(shè)置了onTouchListener
,就執(zhí)行onTouch
方法,并根據(jù)onTouch
的返回值為true還是false來(lái)決定是否執(zhí)行onTouchEvent
方法,如果是false則繼續(xù)執(zhí)行onTouchEvent
,在onTouchEvent
的Action Up事件中判斷,如果設(shè)置了onClickListener
,就執(zhí)行onClick
方法。
View隨著Activity的創(chuàng)建而加載,startActivity
啟動(dòng)一個(gè)Activity時(shí),在ActivityThread
的handleLaunchActivity
方法中會(huì)執(zhí)行Activity的onCreate
方法,這個(gè)時(shí)候會(huì)調(diào)用setContentView
加載布局創(chuàng)建出DecorView
并將我們的layout加載到DecorView
中,當(dāng)執(zhí)行到handleResumeActivity
時(shí),Activity的onResume
方法被調(diào)用,然后WindowManager
會(huì)將DecorView
設(shè)置給ViewRootImpl
,這樣,DecorView
就被加載到Window中了,此時(shí)界面還沒(méi)有顯示出來(lái),還需要經(jīng)過(guò)View的measure,layout和draw方法,才能完成View的工作流程。我們需要知道View的繪制是由ViewRoot
來(lái)負(fù)責(zé)的,每一個(gè)DecorView
都有一個(gè)與之關(guān)聯(lián)的ViewRoot
,這種關(guān)聯(lián)關(guān)系是由WindowManager
維護(hù)的,將DecorView
和ViewRoot
關(guān)聯(lián)之后,ViewRootImpl
的requestLayout
會(huì)被調(diào)用以完成初步布局,通過(guò)scheduleTraversals
方法向主線程發(fā)送消息請(qǐng)求遍歷,最終調(diào)用ViewRootImpl
的performTraversals
方法,這個(gè)方法會(huì)執(zhí)行View的measure layout 和draw流程
在上邊的分析中我們知道,View繪制流程的入口在ViewRootImpl
的performTraversals
方法,在方法中首先調(diào)用performMeasure
方法,傳入一個(gè)childWidthMeasureSpec
和childHeightMeasureSpec
參數(shù),這兩個(gè)參數(shù)代表的是DecorView
的MeasureSpec
值,這個(gè)MeasureSpec
值由窗口的尺寸和DecorView
的LayoutParams決定,最終調(diào)用View的measure方法進(jìn)入測(cè)量流程
measure:
View的measure過(guò)程由ViewGroup
傳遞而來(lái),在調(diào)用View.measure方法之前,會(huì)首先根據(jù)View自身的LayoutParams
和父布局的MeasureSpec
確定子view的MeasureSpec
,然后將view寬高對(duì)應(yīng)的measureSpec
傳遞到measure方法中,那么子view的MeasureSpec
獲取規(guī)則是怎樣的?分幾種情況進(jìn)行說(shuō)明
1.父布局是EXACTLY模式:
2.父布局是AT_MOST模式:
3.父布局是UNSPECIFIED模式:
獲取到寬高的MeasureSpec
后,傳入view的measure方法中來(lái)確定view的寬高,這個(gè)時(shí)候還要分情況
1. 當(dāng)
MeasureSpec
的mode是UNSPECIFIED,此時(shí)view的寬或者高要看view有沒(méi)有設(shè)置背景,如果沒(méi)有設(shè)置背景,就返回設(shè)置的minWidth
或minHeight
,這兩個(gè)值如果沒(méi)有設(shè)置默認(rèn)就是0,如果view設(shè)置了背景,就取minWidth
或minHeight
和背景這個(gè)drawable
固有寬或者高中的大值返回
2. 當(dāng)MeasureSpec
的mode是AT_MOST和EXACTLY,此時(shí)view的寬高都返回從MeasureSpec
中獲取到的size值,這個(gè)值的確定見(jiàn)上邊的分析。因此如果要通過(guò)繼承view實(shí)現(xiàn)自定義view,一定要重寫(xiě)onMeasure
方法對(duì)wrap_conten
屬性做處理,否則,他的match_parent和wrap_content屬性效果就是一樣的
layout:
layout方法的作用是用來(lái)確定view本身的位置,onLayout
方法用來(lái)確定所有子元素的位置,當(dāng)ViewGroup
的位置確定之后,它在onLayout
中會(huì)遍歷所有的子元素并調(diào)用其layout方法,在子元素的layout方法中onLayout
方法又會(huì)被調(diào)用。layout方法的流程是,首先通過(guò)setFrame
方法確定view四個(gè)頂點(diǎn)的位置,然后view在父容器中的位置也就確定了,接著會(huì)調(diào)用onLayout
方法,確定子元素的位置,onLayout
是個(gè)空方法,需要繼承者去實(shí)現(xiàn)。
getMeasuredHeight
和getHeight
方法有什么區(qū)別?getMeasuredHeight
(測(cè)量高度)形成于view的measure過(guò)程,getHeight
(最終高度)形成于layout過(guò)程,在有些情況下,view需要measure多次才能確定測(cè)量寬高,在前幾次的測(cè)量過(guò)程中,得出的測(cè)量寬高有可能和最終寬高不一致,但是最終來(lái)說(shuō),還是會(huì)相同,有一種情況會(huì)導(dǎo)致兩者值不一樣,如下,此代碼會(huì)導(dǎo)致view的最終寬高比測(cè)量寬高大
100px
public void layout(int l,int t,int r, int b){
super.layout(l,t,r+100,b+100);}
draw:
View的繪制過(guò)程遵循如下幾步:
a.繪制背景 background.draw(canvas)
b.繪制自己(onDraw)
c.繪制children(dispatchDraw)
d.繪制裝飾(onDrawScrollBars)
View繪制過(guò)程的傳遞是通過(guò)dispatchDraw
來(lái)實(shí)現(xiàn)的,它會(huì)遍歷所有的子元素的draw方法,如此draw事件就一層一層的傳遞下去了
ps: view
有一個(gè)特殊的方法setWillNotDraw
,如果一個(gè)view不需要繪制內(nèi)容,即不需要重寫(xiě)onDraw
方法繪制,可以開(kāi)啟這個(gè)標(biāo)記,系統(tǒng)會(huì)進(jìn)行相應(yīng)的優(yōu)化。默認(rèn)情況下,View沒(méi)有開(kāi)啟這個(gè)標(biāo)記,默認(rèn)認(rèn)為需要實(shí)現(xiàn)onDraw
方法繪制,當(dāng)我們繼承ViewGroup
實(shí)現(xiàn)自定義控件,并且明確知道不需要具備繪制功能時(shí),可以開(kāi)啟這個(gè)標(biāo)記,如果我們重寫(xiě)了onDraw
,那么要顯示的關(guān)閉這個(gè)標(biāo)記
子view寬高可以超過(guò)父view? 能
1) 讓view支持wrap_content屬性,在onMeasure
方法中針對(duì)AT_MOST模式做專門處理,否則wrap_content會(huì)和match_parent效果一樣(繼承ViewGroup
也同樣要在onMeasure
中做這個(gè)判斷處理)
if(widthMeasureSpec == MeasureSpec.AT_MOST && heightMeasureSpec == MeasureSpec.AT_MOST){
setMeasuredDimension(200,200); // wrap_content
這種情況下要設(shè)置一個(gè)默認(rèn)值,200只是舉個(gè)例子,最終的值需要計(jì)算得到剛好包裹內(nèi)容的寬高值
}else if(widthMeasureSpec == MeasureSpec.AT_MOST){
setMeasuredDimension(200,heightMeasureSpec );
}else if(heightMeasureSpec == MeasureSpec.AT_MOST){
setMeasuredDimension(heightMeasureSpec ,200);
}
2) 讓view支持padding(onDraw的時(shí)候,寬高減去padding值,margin由父布局控制,不需要view考慮),自定義ViewGroup需要考慮自身的padding和子view的margin造成的影響
3) 在view中盡量不要使用handler,使用view本身的post方法
4) 在onDetachedFromWindow中及時(shí)停止線程或動(dòng)畫(huà)
5) view帶有滑動(dòng)嵌套情形時(shí),處理好滑動(dòng)沖突
ACTION_DOWN沒(méi)有攔截,ACTION_MOVE ACTION_UP還會(huì)攔截嗎
(更多完整項(xiàng)目下載。未完待續(xù)。源碼。圖文知識(shí)后續(xù)上傳github。)
可以點(diǎn)擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。