前言
上一篇講了Android觸摸事件的傳遞機制,具體可以看這里初識Android觸摸事件傳遞機制。既然知道Android中觸摸事件的傳遞分發,那么它能解決什么樣的問題,在我們實際開發中如何應用,這點很重要,知道原理是為了解決問題而準備的。這篇文章的核心講的如何解決View的滑動沖突,這個問題在日常開發中很常見,比如內部嵌套Fragment視圖是左右滑動,外部用一個ScrollView來包含,可以上下滑動,如果不進行滑動沖突處理的話,就會造成外部滑動方向和內部滑動方向不一致。
目錄
常見的滑動沖突場景
滑動沖突的處理規則
外部攔截法
內部攔截法
小結
常見的滑動沖突場景
常見的滑動沖突場景可以簡單分為以下三種:
場景1:外部滑動方向和內部滑動方向不一致
場景2:外部滑動方向和內部滑動方向一致
場景3:上面兩種情況的嵌套
如圖:
場景1,主要是將ViewPager和Fragment配合使用所組成的頁面滑動效果,主流應用幾乎都會使用這個效果。在這個效果中可以通過左右滑動來切換頁面,而每個頁面內部往往又是一個ListView,所以就造成了滑動沖突,但是在ViewPager內部處理了這種滑動沖突,因此在采用ViewPager時我們就無須關注這個問題,而如果把ViewPager換成ScrollView,那就必須自己手動處理,不然造成的結果就是內外兩層只能一層能夠滑動。
場景2,就復雜一點,當內外兩層都在同一個方向可以滑動的時候,顯然存在邏輯問題。因為當手指開始滑動的時候,系統無法知道用戶到底是想讓哪一層滑動,所以當手指滑動的時候就會出現問題,要么只有一層滑動,要么就是內外兩層都滑動但很卡頓。
場景3,是場景1和場景2兩種情況的嵌套,顯得更復雜了。比如外部有一個SlideMenu效果,內部有一個ViewPager,ViewPager的每一個頁面中又是一個ListView。雖然場景3滑動沖突看起來很復雜,但都是幾個單一的滑動沖突的疊加,因此需要一一拆解開來即可。
滑動沖突的處理規則
一般來說,不管滑動沖突有多么復雜,它都有既定的規則,根據這些規則我們就可以選擇合適的方法去處理。
對于場景1,它的處理規則就是:當用戶左右滑動時,需要讓外部的View攔截點擊事件,當用戶上下滑動,需要讓內部View攔截點擊事件。具體來說就是根據滑動是水平滑動還是豎直滑動來判斷到底是由誰來攔截事件。
如圖:
簡單來說,就是根據水平方向和豎直方向的距離差來判斷,如果是Dx>Dy,那么則是水平滑動,如果是Dy>Dx,那么則是豎直滑動。
場景2,則是比較特殊,它無法根據滑動的角度,距離差以及速度差來做判斷。這個時候就需要從業務上找到突破點,比如,當處于某種狀態時需要外部View響應用戶的滑動,而處于另外一種狀態時需要內部View來響應View的滑動
對于場景3的話,它的滑動規則也更復雜,和場景2一樣,同樣是從業務上找到突破點。
外部攔截法
外部攔截法是指點擊事件都是先經過父容器的攔截處理,如果父容器需要此事件就攔截,如果不需要此事件,就不攔截了,這樣就可以解決滑動沖突的問題,外部攔截法需要重寫父容器的onInterceptTouchEvent方法,在內部做相應的攔截即可,偽代碼如下:
@Override public boolean onInterceptTouchEvent(MotionEvent event) { boolean intercepted = false; int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { intercepted = false; break; } case MotionEvent.ACTION_MOVE: { if (父容器需要點擊當前事件) { intercepted = true; } else { intercepted = false; } break; } case MotionEvent.ACTION_UP: { intercepted = false; break; } default: break; } mLastXIntercept = x; mLastYIntercept = y; return intercepted; }
網站題目:Android觸摸事件的應用詳解-創新互聯
轉載來于:http://m.2m8n56k.cn/article24/dhpsje.html
成都網站建設公司_創新互聯,為您提供定制網站、商城網站、營銷型網站建設、網站改版、靜態網站、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯