欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Android觸摸事件的應用詳解-創(chuàng)新互聯(lián)

前言

創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、成都網(wǎng)站建設與策劃設計,土默特右旗網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設10余年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:土默特右旗等地區(qū)。土默特右旗做網(wǎng)站價格咨詢:028-86922220

上一篇講了Android觸摸事件的傳遞機制,具體可以看這里初識Android觸摸事件傳遞機制。既然知道Android中觸摸事件的傳遞分發(fā),那么它能解決什么樣的問題,在我們實際開發(fā)中如何應用,這點很重要,知道原理是為了解決問題而準備的。這篇文章的核心講的如何解決View的滑動沖突,這個問題在日常開發(fā)中很常見,比如內(nèi)部嵌套Fragment視圖是左右滑動,外部用一個ScrollView來包含,可以上下滑動,如果不進行滑動沖突處理的話,就會造成外部滑動方向和內(nèi)部滑動方向不一致。

目錄

常見的滑動沖突場景
滑動沖突的處理規(guī)則
外部攔截法
內(nèi)部攔截法
小結


常見的滑動沖突場景

常見的滑動沖突場景可以簡單分為以下三種:

場景1:外部滑動方向和內(nèi)部滑動方向不一致
場景2:外部滑動方向和內(nèi)部滑動方向一致
場景3:上面兩種情況的嵌套


如圖:

場景1,主要是將ViewPager和Fragment配合使用所組成的頁面滑動效果,主流應用幾乎都會使用這個效果。在這個效果中可以通過左右滑動來切換頁面,而每個頁面內(nèi)部往往又是一個ListView,所以就造成了滑動沖突,但是在ViewPager內(nèi)部處理了這種滑動沖突,因此在采用ViewPager時我們就無須關注這個問題,而如果把ViewPager換成ScrollView,那就必須自己手動處理,不然造成的結果就是內(nèi)外兩層只能一層能夠滑動。

場景2,就復雜一點,當內(nèi)外兩層都在同一個方向可以滑動的時候,顯然存在邏輯問題。因為當手指開始滑動的時候,系統(tǒng)無法知道用戶到底是想讓哪一層滑動,所以當手指滑動的時候就會出現(xiàn)問題,要么只有一層滑動,要么就是內(nèi)外兩層都滑動但很卡頓。

場景3,是場景1和場景2兩種情況的嵌套,顯得更復雜了。比如外部有一個SlideMenu效果,內(nèi)部有一個ViewPager,ViewPager的每一個頁面中又是一個ListView。雖然場景3滑動沖突看起來很復雜,但都是幾個單一的滑動沖突的疊加,因此需要一一拆解開來即可。

滑動沖突的處理規(guī)則

一般來說,不管滑動沖突有多么復雜,它都有既定的規(guī)則,根據(jù)這些規(guī)則我們就可以選擇合適的方法去處理。

對于場景1,它的處理規(guī)則就是:當用戶左右滑動時,需要讓外部的View攔截點擊事件,當用戶上下滑動,需要讓內(nèi)部View攔截點擊事件。具體來說就是根據(jù)滑動是水平滑動還是豎直滑動來判斷到底是由誰來攔截事件。

如圖:

簡單來說,就是根據(jù)水平方向和豎直方向的距離差來判斷,如果是Dx>Dy,那么則是水平滑動,如果是Dy>Dx,那么則是豎直滑動。

場景2,則是比較特殊,它無法根據(jù)滑動的角度,距離差以及速度差來做判斷。這個時候就需要從業(yè)務上找到突破點,比如,當處于某種狀態(tài)時需要外部View響應用戶的滑動,而處于另外一種狀態(tài)時需要內(nèi)部View來響應View的滑動

對于場景3的話,它的滑動規(guī)則也更復雜,和場景2一樣,同樣是從業(yè)務上找到突破點。

外部攔截法

外部攔截法是指點擊事件都是先經(jīng)過父容器的攔截處理,如果父容器需要此事件就攔截,如果不需要此事件,就不攔截了,這樣就可以解決滑動沖突的問題,外部攔截法需要重寫父容器的onInterceptTouchEvent方法,在內(nèi)部做相應的攔截即可,偽代碼如下:

 @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;
 }

網(wǎng)站題目:Android觸摸事件的應用詳解-創(chuàng)新互聯(lián)
轉載來于:http://chinadenli.net/article24/dhpsje.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站商城網(wǎng)站、營銷型網(wǎng)站建設網(wǎng)站改版、靜態(tài)網(wǎng)站App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化