這個文集中文章主要是自己在學習中記錄的重要知識點,方便日后查閱。
什么是View?
View是所有控件的基類,ViewGroup也是View的子類。ViewGroup中包含多個View。
View的典型子類:Button、TextView等…
ViewGroup典型的子類:LinearLayout、RelativeLayout等…
View的位置參數
其中getLeft()、getRight()、getTop()、getBottom()是View中的方法
getX()、getY()、getRawX()、getRawY()是MotionEvent中的方法
TouhSlop
是系統所能識別出的被認為是滑動的最小距離,意思當手指滑動時,兩次滑動之間的距離小于這個常量,系統就不認為是滑動操作。
VelocityTracker
速度追蹤器,用于追蹤手指在滑動過程中的速度。
GestureDetector
手勢檢測,用于輔助檢測用戶的單擊、滑動、長按、雙擊等行為。
Scroller
彈性滑動對象、用于實現View的彈性滑動
View的滑動
1.使用scrollTo/scrollBy
2.使用動畫ObjectAnimator
3.改變布局參數LayoutParams
彈性滑動
1.使用Scroller
2.通過動畫ObjectAnimator/ValueAnimator
3.使用延時策略使用Handler或者View的postDelayed
View的事件分發機制
所謂點擊事件的分發,就是對MotionEvent事件的分發過程,即當一個MotionEvent產生以后,系統需要把這個事件傳遞到具體的View,這個傳遞的過程就是分發的過程。
重要方法
dispatchTouchEvent(MotionEvent ev);進行時事件的分發
onInterceptTouchEvent(MotionEvent ev);用來判斷是否攔截某個事件
onTouchEven(MotionEvent ev);處理點擊事件
事件的調度順序應該是
onTouchListener > onTouchEvent > onLongClickListener > onClickListener。
結論總結
ViewGroup默認不攔截任何事件,onInterceptTouchEvent方法默認返回false。
View沒有onInterceptTouchEvent方法,有點擊事件傳遞給它,就調用它的onTouchEvent方法。
View只要它的clickable或者longClickable有一個為true,TouchEvent就返回true。不受View的enable屬性影響。
View的滑動沖突
常見滑動沖突
1.外部滑動方向和內部滑動方向不一致
2.外部滑動方向和內部滑動方向一致
3.上面兩種情況的嵌套
滑動沖突的解決方式
1.外部攔截法:指的是點擊事件先經過父容器的攔截處理,父容器需要此事件就攔截。外部攔截法需要重寫父容器的onInterceptTouchEvent方法
2.內部攔截法:指的是父容器不攔截任何事件,所有事件都傳遞給子元素,子元素需要此事件就直接消耗掉,否則就由父容器處理。此方法需要重寫子元素的dispatchTouchEvent方法還需要配合requestDisallowInterceptTouchEvent才能正常工作。
由于內部攔截法相對外部攔截法相對復雜,一般建議采用外部攔截法來解決常見的滑動沖突。