第三章 View的事件體系—學習筆記

這個文集中文章主要是自己在學習中記錄的重要知識點,方便日后查閱。

什么是View?

View是所有控件的基類,ViewGroup也是View的子類。ViewGroup中包含多個View。
View的典型子類:Button、TextView等…
ViewGroup典型的子類:LinearLayout、RelativeLayout等…

View的位置參數

位置參數.PNG

其中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才能正常工作。

由于內部攔截法相對外部攔截法相對復雜,一般建議采用外部攔截法來解決常見的滑動沖突。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容