android開發view簡單總結

1.View是Android中所有控件的基類,View是一種界面層的控件的一種抽象代表了一個控件。ViewGrouo繼承與VIew,所以View本身就可以是單個控件也可以是多個控件組成的一組控件

2.View位置描述的幾個點:top.left.right.bottom,這幾個值均是針對Vie原始位置的上左右下位置信息,即使View移動時,其值也不會發生變化,此時變化的是x和translationX,y和translationY

3.getX/getY:返回相對於當前View左上角的x和Y座標

getRawX和getRawY:返回相對於手機屏幕左上角的x和y座標

4.TouchSlop:系統可以識別出的滑動的最小距離,是一個常量和設備有關,可以通過ViewConfiguration.get(getContext).getScaledTouchSlop()獲得

5.Scroller配合computerScroll可以實現彈性滑動效果,並不會像scrollBy和scrollTo那樣瞬間完成。

6.View滑動的三種方式

6-1:View本身提供的scrollTo,scrollBy方法(scrollBy:基於當前位置的相對滑動,內部調用scrollTo,scrollTo基於所傳遞參數的絕對滑動,操作簡單,適合對View內容的移動,這種方式也只能滑動View的內容,而不能滑動View本身)

6-2:使用位移動畫(補間動畫只是改變了View內容的位置,並沒有改變View真正位置,屬性動畫改變的是VIew真正的位置,使用簡單,適用於沒有交互的View和實現複雜的動畫效果)

6-3:動態改變View佈局參數(操作複雜,適用於有交互的View)

7.View彈性滑動的實現思想:將一次大的滑動分成若干次小的滑動並且在一個時間段內完成

8.Scrller滑動的思想:通過startScroll中的invalidate方法去觸發draw方法,然後draw方法中的computeScroll方法將會被調用,computerScroll方法中獲取當前的x和y,然後通過scrollTo方法去滑動,然後又通過postInvalidate方法觸發draw方法,如此循環往復,直至滑動結束。其中X和Y是根據滑動總距離和滑動時間計算出的,計算思想相似於屬性動畫中插值器的概念。

9.通過延時器的策略去實現滑動,主要是利用插值器獲取時間節點對應的X和Y。

10.View事件分發其實就是對MotionEvent事件的分發過程,即當一個MotionEvent產生以後,系統需要把這個事件傳遞給一個具體的View,而這個傳遞過程就是分發過程。三個重要的方法:dispatchEvent、onInterceptTouchEvent、和onTouchEvent

11.dispatchTouchEvent:表示是否消耗當前事件,返回結果受當前View的onTouchEvent和下級View的dispatchTouchEvent方法的影響。

12.onInterceptTouchEvent:在dispatchTouchEvent中調用,表示是否攔截某事件,如果當前View攔截了某個事件,那麼在同一個事件序列當中,此方法不會再被調用,返回結果表示是否攔截當前事件。

13.onTouchEvent:在dispatchTouchEvent方法中調用,表示是否消耗當前事件,如果不消耗,則在同一個事件序列中此方法將不會再被調用

14.事件分發調用優先級:OnTouch>onTouchEvent>onClick,事件傳遞的順序:Activity-window-View

15.事件一旦交給一個View處理,那麼他就必須消耗掉事件,否則同一事件序(手指按下屏幕開始,離開屏幕結束,down-move….move-up)列中剩下的事件將不會交給他處理

16.子元素中可以通過requestDisallowInterceptTouchEvent方法干預父元素中的事件分發

17.ViewRoot對應於ViewRootImpl類,連接WindowManger和DecorView,View的三大流程均通過ViewRoot來完成,View的繪製流程從ViewRoot的performTraversals開始,進過mesure、layout、draw三個過程。performTraversals會依次調用performMeasure、performLayout和performDraw三個方法,這三個方法分別完成頂層View的measure、Layout、draw,performMeasure中調用measure,measure中調用onMeasure,在onMeasure中完成對所有子元素的measure,這時候measure流程就從父容器傳遞到了子元素,完成了一次measure過程。

18.獲取View寬和高的方式

18-1.onWindowFocusChanged(會多次調用)

18-2.view.post(Runnable)

18-3.ViewTreeObserver在onGlobalLayout接口中

18-4.view.measure方法

19.getMeasuredWidth獲取到的是測量寬高(onMeasure方法中),getWidth獲取到的是最終寬高(onLayout方法中)mRight-mLeft的值,除非某種特殊的情況,否則二者相等。

20.View的draw過程

20-1.繪製背景 background.draw(canvas)

20-2.繪製自己(onDraw)

20-3.繪製children(dispatchDraw)

20-4.繪製裝飾(onDrawScrollBars)

21.自定義View時候,兩個重要的方法onAttachToWindow方法和onDetachToWindow方法,當View不可見時,記得需要停止View的動畫,否則有可能呢造成內存泄漏

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