《Android開發(fā)藝術探索》-第三章-View的事件體系

  1. View 基礎
    • View的位置參數(shù)
    • View的位置主要由四個頂點決定,四個屬性:top left right buttom 。這些坐標都是相對坐標,相對于父容器。left = getLeft()。
    • 從3.0開始,增加了幾個參數(shù)。x y translationX translationY。x = left + translationX。當view向右移動時,left不變,translationX變大,x隨之變大。
    • MotionEvent 和 TouchSlop
      • 按下 : ACTION_DOWN 移動 : ACTION_MOVE 松開 : ACTION_UP
      • 通過 MotionEvent 對象獲取事件發(fā)生的 x y 坐標。 getX() getY() 獲取的是相對于當前View的坐標, getRawX() getRawY() 獲取相對于左上角的 x y 坐標。
      • TouchSlop 是系統(tǒng)能夠識別出的滑動的最小距離。ViewConfiguration.get(getContext()).getScaledTouchSlop()。
    • VelocityTracker GestureDetector Scroller
      • 使用 VelocityTracker 需要注意的是當不需要的時候,需要調用 clear 方法重置并回收內存。
      • 為了輔助檢測用戶的 單擊 滑動 長按 雙擊 等行為,可以是用 GestureDetector。首先創(chuàng)建一個 GestureDetector 對象并實現(xiàn) OnGestureListener 接口。然后接管目標
        View 的onTouchEvent 方法。最后就可以有選擇的實現(xiàn) OnGestureListener 和 OnDoubleTabListener 中的方法了。
      • scrollTo/scrollBy 方法進行滑動時,其過程是瞬間完成的。此時可以使用 Scroller 滑動效果。
  2. View 滑動
    • 三種方法:1. 通過 View 本身提供的 scrollTo/scrollBy 方法 2. 動畫 3. 改變 View 的 LayoutParams。
    • View 動畫是對 View 的影像進行操作,并不會改變 View 的未知參數(shù)和寬高。
    • 改變 LayoutParams 通過改變 View 的 marginLeft 屬性。
    • 比較:1. scrollTo/scrollBy 只能滑動 View 中的內容部分,而不能滑動 View 的位置。 2. 動畫適用于不需要交互的 View 3. LayoutParams 適用于需要交互的 View。
  3. 彈性滑動
    • 彈性滑動的共同思想都是將大滑動分成若干次小的滑動,并在一個時間段內完成。具體可以通過Scroller、Handler&postDelayer以及Thread&sleep等。
    • 使用Scroller:原理:首先調用Scroller.startScroll()方法,然后調用invalidate()方法重繪,onDraw()方法中會調用computeScroll()方法,在該方法中獲取當前的scrollX和scrollY,然后調用scrollTo()實現(xiàn)滑動,然后再次重繪。
    • 動畫:動畫沒什么好說的,屬性動畫
    • Handler&postDelay:通過延時發(fā)送消息,在消息中進行View滑動,接連不斷的發(fā)送消息,實現(xiàn)彈性滑動。
  4. View的事件分發(fā)機制
    • 當一個MotionEvent產(chǎn)生以后,系統(tǒng)需要把這些事件傳遞給一個具體的View,這個傳遞的過程就是分發(fā)過程。
      分發(fā)過程由三個方法完成:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent。
    • dispatchTouchEvent:用來進行事件分發(fā),如果事件能夠傳遞到當前View,則一定會調用到這個方法。返回值受當前View的onTouchEvent和下級View的dispatchTouchView影響,表示是否消耗這個事件。
    • onInterceptTouchEvent():表示是否攔截這個事件,如果當前View攔截,那么在同一個事件序列中,此方法不會再被調動,返回結果表示是否攔截。
    • onTouchEvent:用來處理單擊事件,返回值表示是否消耗當前事件。
  5. View的滑動沖突
    • 內外滑動方向不一致:ScrollView和ListView的沖突:左右滑時,讓外部攔截點擊事件,上下滑時,內部攔截,所以首先需要判斷滑動的方向。。
    • 內外滑動方向一致:無法判斷用戶想讓哪一層滑動:不能通過方向判斷,可以通過業(yè)務邏輯(設置狀態(tài))。
    • 以上的嵌套。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容