Android必備知識點之View體系及自定義View

複習思路:反問學習法
what?
與用戶交互,將內容展示給用戶,通過一個個view實現的,Android所有控件的基類,我們平常所用的TextView和ImageView都是繼承自View的。

why?
面試主要圍繞這四個模塊回答:
1.View的滑動
2.View 的事件分發
3. View 的工作流程
4. 自定義View

where?
這裏可以對應why的四個模塊舉例說明即可

一.基礎概念回顧

1.1 View與ViewGroup的關係

ViewGroup 可以理解爲 View 的組合,它可以包含很多 View 以及ViewGroup,而它包含的 ViewGroup又可以包含View和ViewGroup,依此類推,形成一個View樹
在這裏插入圖片描述

1.2 座標系

在這裏插入圖片描述

1.2.1 View自身的座標

通過如下方法可以獲得View到其父控件(ViewGroup)的距離。

• getTop():獲取View自身頂邊到其父佈局頂邊的距離。

• getLeft():獲取View自身左邊到其父佈局左邊的距離。

• getRight():獲取View自身右邊到其父佈局左邊的距離。

• getBottom():獲取View自身底邊到其父佈局頂邊的距離。

1.2.2 MotionEvent獲取焦點座標的各種方法。

• getX():獲取點擊事件距離控件左邊的距離,即視圖座標。

• getY():獲取點擊事件距離控件頂邊的距離,即視圖座標。

• getRawX():獲取點擊事件距離整個屏幕左邊的距離,即絕對座標。

• getRawY():獲取點擊事件距離整個屏幕頂邊的距離,即絕對座標。

二.View的滑動

當點擊事件傳到View時,系統記下觸摸點的座標,手指移動時系統記下移動後觸摸的座標並算出偏移量,並通過偏移量來修改View的座標。

2.1 滑動方法

實現View滑動有很多種 方法,主要用到6種滑動方法,分別是layout()、offsetLeftAndRight()與 offsetTopAndBottom()、LayoutParams、動畫、scollTo 與 scollBy,以及Scroller。

2.1.1 layout

View進行繪製的時候會調用onLayout()方法來設置顯示的位置,因此我們同樣也可以通過修改View 的left、top、right、bottom這4種屬性來控制View的座標。

2.1.2 LayoutParams

LayoutParams主要保存了一個View的佈局參數,因此我們可以通過LayoutParams來改變View的佈局參 數從而達到改變View位置的效果。

2.1.3 scrollTo與scollBy

scrollTo(x,y)表示移動到一個具體的座標點,而scrollBy(dx,dy)則表示移動的增量爲dx、dy。

1.MeasureSpec

在測量過程中,系統會將View的LayoutParams根據父容器所施加的規則轉換成對應的MeasureSpec,然後再根據這個measureSpec來測量出View的寬高

32位int值,高2位爲SpecMode,低30位爲SpecSize

SpecMode有三種類型:

①UNSPECIFIED:父容器不對View有任何限制

②EXACTLY:View指定精確大小

③AT_MOST:父容器指定大小,View不能超過

如果從代碼上來看view.measure(int widthMeasureSpec, int heightMeasureSpec) 的兩個MeasureSpec是父類傳遞過來的,但並不是完全是父View的要求,而是父View的MeasureSpec和子View自己的LayoutParams共同決定的,而子View的LayoutParams其實就是我們在xml寫的時候設置的layout_width和layout_height 轉化而來的。父View的measure的過程會先測量子View,等子View測量結果出來後,再來測量自己

###2.View的工作流程

主要指measure(測量)、layout(佈局)、draw(繪製)三個過去,measure確定View的測量寬高,layout確定View的最終寬高和四個頂點的位置,draw將View繪製到屏幕上

measure()是一個final方法,子類不能重寫,所以在View中調用View的onMeasure方法,其他類似,這裏不展開復習了。。。

這篇博文寫的很不錯,這裏就不多去贅述了:https://www.jianshu.com/p/5a71014e7b1b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章