大廠除了技術(shù)深度之外,還要求你具備一些廣度的知識,比如你要會前端知識,會混合開發(fā),至少會一種腳本語言,C c++更不用說了,也是必會的。
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),興賓企業(yè)網(wǎng)站建設(shè),興賓品牌網(wǎng)站建設(shè),網(wǎng)站定制,興賓網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,興賓網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
為此我吧這些知識整理成了一個983的PDF,從基礎(chǔ)到進階。含有BATJ.字節(jié)跳動面試專題,算法專題,高端技術(shù)專題,混合開發(fā)專題,java面試專題,Android,Java小知識,到性能優(yōu)化.線程.View.OpenCV.NDK等應(yīng)有盡有。還有輔之相關(guān)的視頻+學(xué)習(xí)筆記
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)
1.Hybrid做過嗎?
2.Hybrid通信原理是什么,有做研究嗎?
3.react native有多少了解?講一下原理。
4.weex了解嗎?如何自己實現(xiàn)類似技術(shù)?
5.flutter了解嗎?內(nèi)部是如何實現(xiàn)跨平臺的?
6.Dart語言有研究貴嗎?
7.快應(yīng)用了解嗎?跟其她方式相比有什么優(yōu)缺點?
8.說說你用過的混合開發(fā)技術(shù)有哪些?各有什么優(yōu)缺點?
9.Python會嗎?
10.會不會PHP?
11.Gradle了解多少?groovy語法會嗎?
a)layout(left,top,right,bottom):通過修改View四個方向的屬性值來修改View的坐標(biāo),從而滑動View
b)offsetLeftAndRight() offsetTopAndBottom():指定偏移量滑動view
c )LayoutParams,改變布局參數(shù):layoutParams中保存了view的布局參數(shù),可以通過修改布局參數(shù)的方式滑動view
d )通過動畫來移動view:注意安卓的平移動畫不能改變view的位置參數(shù),屬性動畫可以
e )scrollTo/scrollBy
:注意移動的是view的內(nèi)容,scrollBy
(50,50)你會看到屏幕上的內(nèi)容向屏幕的左上角移動了,這是參考對象不同導(dǎo)致的,你可以看作是它移動的是手機屏幕,手機屏幕向右下角移動,那么屏幕上的內(nèi)容就像左上角移動了
f )scroller:scroller
需要配置computeScroll
方法實現(xiàn)view的滑動,scroller
本身并不會滑動view,它的作用可以看作一個插值器,它會計算當(dāng)前時間點view應(yīng)該滑動到的距離,然后view不斷的重繪,不斷的調(diào)用computeScroll
方法,這個方法是個空方法,所以我們重寫這個方法,在這個方法中不斷的從scroller
中獲取當(dāng)前view的位置,調(diào)用scrollTo方法實現(xiàn)滑動的效果
點擊事件產(chǎn)生后,首先傳遞給Activity的dispatchTouchEvent
方法,通過PhoneWindow
傳遞給DecorView
,然后再傳遞給根ViewGroup
,進入ViewGroup
的dispatchTouchEvent
方法,執(zhí)行onInterceptTouchEvent
方法判斷是否攔截,再不攔截的情況下,此時會遍歷ViewGroup
的子元素,進入子View的dispatchToucnEvent
方法,如果子view設(shè)置了onTouchListener
,就執(zhí)行onTouch
方法,并根據(jù)onTouch
的返回值為true還是false來決定是否執(zhí)行onTouchEvent
方法,如果是false則繼續(xù)執(zhí)行onTouchEvent
,在onTouchEvent
的Action Up事件中判斷,如果設(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
來負責(zé)的,每一個DecorView
都有一個與之關(guān)聯(lián)的ViewRoot
,這種關(guān)聯(lián)關(guān)系是由WindowManager
維護的,將DecorView
和ViewRoot
關(guān)聯(lián)之后,ViewRootImpl
的requestLayout
會被調(diào)用以完成初步布局,通過scheduleTraversals
方法向主線程發(fā)送消息請求遍歷,最終調(diào)用ViewRootImpl
的performTraversals
方法,這個方法會執(zhí)行View的measure layout 和draw流程
在上邊的分析中我們知道,View繪制流程的入口在ViewRootImpl
的performTraversals
方法,在方法中首先調(diào)用performMeasure
方法,傳入一個childWidthMeasureSpec
和childHeightMeasureSpec
參數(shù),這兩個參數(shù)代表的是DecorView
的MeasureSpec
值,這個MeasureSpec
值由窗口的尺寸和DecorView
的LayoutParams決定,最終調(diào)用View的measure方法進入測量流程
measure:
View的measure過程由ViewGroup
傳遞而來,在調(diào)用View.measure方法之前,會首先根據(jù)View自身的LayoutParams
和父布局的MeasureSpec
確定子view的MeasureSpec
,然后將view寬高對應(yīng)的measureSpec
傳遞到measure方法中,那么子view的MeasureSpec
獲取規(guī)則是怎樣的?分幾種情況進行說明
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è)置默認就是0,如果view設(shè)置了背景,就取minWidth
或minHeight
和背景這個drawable
固有寬或者高中的最大值返回
2.當(dāng)MeasureSpec
的mode是AT_MOST和EXACTLY,此時view的寬高都返回從MeasureSpec
中獲取到的size值,這個值的確定見上邊的分析。因此如果要通過繼承view實現(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四個頂點的位置,然后view在父容器中的位置也就確定了,接著會調(diào)用onLayout
方法,確定子元素的位置,onLayout
是個空方法,需要繼承者去實現(xiàn)。
getMeasuredHeight
和getHeight
方法有什么區(qū)別?getMeasuredHeight
(測量高度)形成于view的measure過程,getHeight
(最終高度)形成于layout過程,在有些情況下,view需要measure多次才能確定測量寬高,在前幾次的測量過程中,得出的測量寬高有可能和最終寬高不一致,但是最終來說,還是會相同,有一種情況會導(dǎo)致兩者值不一樣,如下,此代碼會導(dǎo)致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
來實現(xiàn)的,它會遍歷所有的子元素的draw方法,如此draw事件就一層一層的傳遞下去了
ps:view
有一個特殊的方法setWillNotDraw
,如果一個view不需要繪制內(nèi)容,即不需要重寫onDraw
方法繪制,可以開啟這個標(biāo)記,系統(tǒng)會進行相應(yīng)的優(yōu)化。默認情況下,View沒有開啟這個標(biāo)記,默認認為需要實現(xiàn)onDraw
方法繪制,當(dāng)我們繼承ViewGroup
實現(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è)置一個默認值,200只是舉個例子,最終的值需要計算得到剛好包裹內(nèi)容的寬高值
}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還會攔截嗎
(更多完整項目下載。未完待續(xù)。源碼。圖文知識后續(xù)上傳github。)
可以點擊關(guān)于我聯(lián)系我獲取完整PDF
(VX:×××)
網(wǎng)頁名稱:關(guān)于AndoridView的種種,這里告訴你答案
當(dāng)前鏈接:http://chinadenli.net/article36/pddssg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、手機網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、網(wǎng)站導(dǎo)航、、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)