一 View ,ViewGroup的繪制過程
ViewGroup繪制包括兩個步驟:1.measure 2.layout
在兩個步驟中分別調用回調函數:1.onMeasure() 2.onLayout()
1.onMeasure() 在這個函數中,ViewGroup會接受childView的請求的大小,然後通過childView的measure(newWidthMeasureSpec, heightMeasureSpec)函數存儲到childView中,以便childView的getMeasuredWidth() andgetMeasuredHeight() 的值可以被後續工作得到。
2.onLayout() 在這個函數中,ViewGroup會拿到childView的getMeasuredWidth() andgetMeasuredHeight(),用來布局所有的childView。
3.View.MeasureSpec與 LayoutParams 這兩個類,是ViewGroup與childView協商大小用的。其中,View.MeasureSpec是ViewGroup用來部署childView用的, LayoutParams是childView告訴ViewGroup 我需要多大的地方。
4.在View 的onMeasure的最後要調用setMeasuredDimension()這個方法存儲View的大小,這個方法決定了當前View的大小。
具體詳見Android官方文檔 dev guide->User Interface->How Android Draws Views
二 View,ViewGroup的手勢監聽順序與使用
View的手勢監聽相關回調函數:onTouchEvent()
ViewGroup的手勢監聽相關回調函數:onTouchEvent(),onInterceptTouchEvent()
1.這兩個回調函數都會返回一個boolean變量,表示是否消費了此手勢。如果消費了,返回true,如果未消費,返回false。
2.當用戶觸摸一下屏幕,產生手勢MotionEvent,
ViewGroup的onInterceptTouchEvent()會接受此MotionEvent。
如果此回調函數返回true,則表示此ViewGroup消費了此手勢,不想再讓他的childView去處理,childView的onTouchEvent()便不會再接受此手勢,同時此ViewGroup的onTouchEvent()會接受此手勢。
如果此回調函數返回false,則表示此ViewGroup未消費了此手勢,想讓他的childView去處理,childView的onTouchEvent()接受此手勢,同時此ViewGroup的onTouchEvent()不會接受此手勢。