您好,登錄后才能下訂單哦!
大廠除了技術深度之外,還要求你具備一些廣度的知識,比如你要會前端知識,會混合開發,至少會一種腳本語言,C c++更不用說了,也是必會的。
為此我吧這些知識整理成了一個983的PDF,從基礎到進階。含有BATJ.字節跳動面試專題,算法專題,高端技術專題,混合開發專題,java面試專題,Android,Java小知識,到性能優化.線程.View.OpenCV.NDK等應有盡有。還有輔之相關的視頻+學習筆記
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:×××)
1.Hybrid做過嗎?
2.Hybrid通信原理是什么,有做研究嗎?
3.react native有多少了解?講一下原理。
4.weex了解嗎?如何自己實現類似技術?
5.flutter了解嗎?內部是如何實現跨平臺的?
6.Dart語言有研究貴嗎?
7.快應用了解嗎?跟其她方式相比有什么優缺點?
8.說說你用過的混合開發技術有哪些?各有什么優缺點?
9.Python會嗎?
10.會不會PHP?
11.Gradle了解多少?groovy語法會嗎?
a)layout(left,top,right,bottom):通過修改View四個方向的屬性值來修改View的坐標,從而滑動View
b)offsetLeftAndRight() offsetTopAndBottom():指定偏移量滑動view
c )LayoutParams,改變布局參數:layoutParams中保存了view的布局參數,可以通過修改布局參數的方式滑動view
d )通過動畫來移動view:注意安卓的平移動畫不能改變view的位置參數,屬性動畫可以
e )scrollTo/scrollBy
:注意移動的是view的內容,scrollBy
(50,50)你會看到屏幕上的內容向屏幕的左上角移動了,這是參考對象不同導致的,你可以看作是它移動的是手機屏幕,手機屏幕向右下角移動,那么屏幕上的內容就像左上角移動了
f )scroller:scroller
需要配置computeScroll
方法實現view的滑動,scroller
本身并不會滑動view,它的作用可以看作一個插值器,它會計算當前時間點view應該滑動到的距離,然后view不斷的重繪,不斷的調用computeScroll
方法,這個方法是個空方法,所以我們重寫這個方法,在這個方法中不斷的從scroller
中獲取當前view的位置,調用scrollTo方法實現滑動的效果
點擊事件產生后,首先傳遞給Activity的dispatchTouchEvent
方法,通過PhoneWindow
傳遞給DecorView
,然后再傳遞給根ViewGroup
,進入ViewGroup
的dispatchTouchEvent
方法,執行onInterceptTouchEvent
方法判斷是否攔截,再不攔截的情況下,此時會遍歷ViewGroup
的子元素,進入子View的dispatchToucnEvent
方法,如果子view設置了onTouchListener
,就執行onTouch
方法,并根據onTouch
的返回值為true還是false來決定是否執行onTouchEvent
方法,如果是false則繼續執行onTouchEvent
,在onTouchEvent
的Action Up事件中判斷,如果設置了onClickListener
,就執行onClick
方法。
View隨著Activity的創建而加載,startActivity
啟動一個Activity時,在ActivityThread
的handleLaunchActivity
方法中會執行Activity的onCreate
方法,這個時候會調用setContentView
加載布局創建出DecorView
并將我們的layout加載到DecorView
中,當執行到handleResumeActivity
時,Activity的onResume
方法被調用,然后WindowManager
會將DecorView
設置給ViewRootImpl
,這樣,DecorView
就被加載到Window中了,此時界面還沒有顯示出來,還需要經過View的measure,layout和draw方法,才能完成View的工作流程。我們需要知道View的繪制是由ViewRoot
來負責的,每一個DecorView
都有一個與之關聯的ViewRoot
,這種關聯關系是由WindowManager
維護的,將DecorView
和ViewRoot
關聯之后,ViewRootImpl
的requestLayout
會被調用以完成初步布局,通過scheduleTraversals
方法向主線程發送消息請求遍歷,最終調用ViewRootImpl
的performTraversals
方法,這個方法會執行View的measure layout 和draw流程
在上邊的分析中我們知道,View繪制流程的入口在ViewRootImpl
的performTraversals
方法,在方法中首先調用performMeasure
方法,傳入一個childWidthMeasureSpec
和childHeightMeasureSpec
參數,這兩個參數代表的是DecorView
的MeasureSpec
值,這個MeasureSpec
值由窗口的尺寸和DecorView
的LayoutParams決定,最終調用View的measure方法進入測量流程
measure:
View的measure過程由ViewGroup
傳遞而來,在調用View.measure方法之前,會首先根據View自身的LayoutParams
和父布局的MeasureSpec
確定子view的MeasureSpec
,然后將view寬高對應的measureSpec
傳遞到measure方法中,那么子view的MeasureSpec
獲取規則是怎樣的?分幾種情況進行說明
1.父布局是EXACTLY模式:
2.父布局是AT_MOST模式:
3.父布局是UNSPECIFIED模式:
獲取到寬高的MeasureSpec
后,傳入view的measure方法中來確定view的寬高,這個時候還要分情況
1. 當
MeasureSpec
的mode是UNSPECIFIED,此時view的寬或者高要看view有沒有設置背景,如果沒有設置背景,就返回設置的minWidth
或minHeight
,這兩個值如果沒有設置默認就是0,如果view設置了背景,就取minWidth
或minHeight
和背景這個drawable
固有寬或者高中的最大值返回
2. 當MeasureSpec
的mode是AT_MOST和EXACTLY,此時view的寬高都返回從MeasureSpec
中獲取到的size值,這個值的確定見上邊的分析。因此如果要通過繼承view實現自定義view,一定要重寫onMeasure
方法對wrap_conten
屬性做處理,否則,他的match_parent和wrap_content屬性效果就是一樣的
layout:
layout方法的作用是用來確定view本身的位置,onLayout
方法用來確定所有子元素的位置,當ViewGroup
的位置確定之后,它在onLayout
中會遍歷所有的子元素并調用其layout方法,在子元素的layout方法中onLayout
方法又會被調用。layout方法的流程是,首先通過setFrame
方法確定view四個頂點的位置,然后view在父容器中的位置也就確定了,接著會調用onLayout
方法,確定子元素的位置,onLayout
是個空方法,需要繼承者去實現。
getMeasuredHeight
和getHeight
方法有什么區別?getMeasuredHeight
(測量高度)形成于view的measure過程,getHeight
(最終高度)形成于layout過程,在有些情況下,view需要measure多次才能確定測量寬高,在前幾次的測量過程中,得出的測量寬高有可能和最終寬高不一致,但是最終來說,還是會相同,有一種情況會導致兩者值不一樣,如下,此代碼會導致view的最終寬高比測量寬高大
100px
public void layout(int l,int t,int r, int b){
super.layout(l,t,r+100,b+100);}
draw:
View的繪制過程遵循如下幾步:
a.繪制背景 background.draw(canvas)
b.繪制自己(onDraw)
c.繪制children(dispatchDraw)
d.繪制裝飾(onDrawScrollBars)
View繪制過程的傳遞是通過dispatchDraw
來實現的,它會遍歷所有的子元素的draw方法,如此draw事件就一層一層的傳遞下去了
ps: view
有一個特殊的方法setWillNotDraw
,如果一個view不需要繪制內容,即不需要重寫onDraw
方法繪制,可以開啟這個標記,系統會進行相應的優化。默認情況下,View沒有開啟這個標記,默認認為需要實現onDraw
方法繪制,當我們繼承ViewGroup
實現自定義控件,并且明確知道不需要具備繪制功能時,可以開啟這個標記,如果我們重寫了onDraw
,那么要顯示的關閉這個標記
子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
這種情況下要設置一個默認值,200只是舉個例子,最終的值需要計算得到剛好包裹內容的寬高值
}else if(widthMeasureSpec == MeasureSpec.AT_MOST){
setMeasuredDimension(200,heightMeasureSpec );
}else if(heightMeasureSpec == MeasureSpec.AT_MOST){
setMeasuredDimension(heightMeasureSpec ,200);
}
2) 讓view支持padding(onDraw的時候,寬高減去padding值,margin由父布局控制,不需要view考慮),自定義ViewGroup需要考慮自身的padding和子view的margin造成的影響
3) 在view中盡量不要使用handler,使用view本身的post方法
4) 在onDetachedFromWindow中及時停止線程或動畫
5) view帶有滑動嵌套情形時,處理好滑動沖突
ACTION_DOWN沒有攔截,ACTION_MOVE ACTION_UP還會攔截嗎
(更多完整項目下載。未完待續。源碼。圖文知識后續上傳github。)
可以點擊關于我聯系我獲取完整PDF
(VX:×××)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。