W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
手勢識別在移動設(shè)備上比在網(wǎng)絡(luò)上要復雜得多。當應(yīng)用程序確定用戶的意圖時,一個觸摸可能要經(jīng)歷幾個階段。例如,應(yīng)用程序需要確定觸摸是否是滾動,滑動部件還是輕擊。這甚至可以在觸摸期間發(fā)生改變,也可以有多個同時觸摸。
要想使組件在沒有任何額外的關(guān)于它們的父組件或子組件的知識的情況下處理這些觸摸交互,需要觸摸應(yīng)答系統(tǒng)。這個系統(tǒng)在 ResponderEventPlugin.js
中實現(xiàn)了,其中包含更多細節(jié)和文檔。
用戶在 web 應(yīng)用程序與本機的可用性上可以感覺到巨大的差異,并且這是最大的原因之一。每一個動作都應(yīng)該有以下屬性:
反饋/高亮——顯示給用戶是什么正在處理他們的觸摸,以及當他們釋放手勢時,會發(fā)生什么
撤銷的能力——當做一個動作時,用戶應(yīng)該能夠在觸摸過程中通過移動手指中止該動作。
這些特性讓用戶使用一個應(yīng)用程序時更舒適,因為它允許人們在實驗和交互時不用擔心犯錯誤。
應(yīng)答系統(tǒng)在使用時可能是復雜的。所以我們?yōu)閼?yīng)該“可以輕擊的”東西提供了一個抽象的 Touchable
實現(xiàn)。這使用了應(yīng)答系統(tǒng),并且使你以聲明的方式可以輕松地識別輕擊交互。在網(wǎng)絡(luò)中任何你會用到按鈕或鏈接的地方使用TouchableHighlight
。
通過實施正確的處理方法,視圖可以成為接觸應(yīng)答器。有兩種方法來詢問視圖是否想成為應(yīng)答器:
View.props.onStartShouldSetResponder: (evt) => true,
——這個視圖是否在觸摸開始時想成為應(yīng)答器?
View.props.onMoveShouldSetResponder: (evt) => true,
——當視圖不是應(yīng)答器時,該指令被在視圖上移動的觸摸調(diào)用:這個視圖想“聲明”觸摸響應(yīng)嗎?
如果視圖返回 true 并且想成為應(yīng)答器,那么下述的一種情況就會發(fā)生:
View.props.onResponderGrant:(evt)= > { }
——視圖現(xiàn)在正在響應(yīng)觸摸事件。這個時候要高亮標明并顯示給用戶正在發(fā)生的事情。
View.props.onResponderReject:(evt)= > { }
——其他的東西時應(yīng)答器并且不會釋放它。
如果視圖正在響應(yīng),那么可以調(diào)用以下處理程序:
View.props.onResponderMove:(evt)= > { }
——用戶正移動他們的手指
View.props.onResponderRelease:(evt)= > { }
——在觸摸最后被引發(fā),即“touchUp”
View.props.onResponderTerminationRequest:(evt)= >true
——其他的東西想成為應(yīng)答器。這種視圖應(yīng)該釋放應(yīng)答嗎?返回 true 就是允許釋放
View.props.onResponderTerminate:(evt)= > { }
——應(yīng)答器已經(jīng)從視圖獲取了??赡茉谡{(diào)用onResponderTerminationRequest
之后被其他視圖獲取,也可能是被操作系統(tǒng)在沒有請求的情況下獲取了(發(fā)生在 iOS 的 control center/notification center)
evt
是一個綜合的觸摸事件,有以下形式:
nativeEvent
changedTouches
——自從上個事件之后,所有發(fā)生改變的觸摸事件的數(shù)組
identifier
——觸摸的 ID
locationX
——觸摸相對于元素的 X 位置
locationY
——觸摸相對于元素的 Y 位置
pageX
——觸摸相對于屏幕的 X 位置
pageY
——觸摸相對于屏幕的 Y 位置
target
——接收觸摸事件的元素的節(jié)點 id
timestamp
——觸摸的時間標識符,用于速度計算
touches
——所有當前在屏幕上觸摸的數(shù)組
在冒泡模式,即最深的節(jié)點最先被調(diào)用,的情況下,onStartShouldSetResponder
和 onMoveShouldSetResponder
被調(diào)用。這意味著,當多個視圖為 * ShouldSetResponder
處理程序返回 true 時,最深的組件會成為應(yīng)答器。在大多數(shù)情況下,這是可取的,因為它確保了所有控件和按鈕是可用的。
然而,有時父組件會想要確保它成為應(yīng)答器。這可以通過使用捕獲階段進行處理。在應(yīng)答系統(tǒng)從最深的組件冒泡時,它將進行一個捕獲階段,引發(fā) * ShouldSetResponderCapture
。所以如果一個父視圖要防止子視圖在觸摸開始時成為應(yīng)答器,它應(yīng)該有一個 onStartShouldSetResponderCapture
處理程序,返回 true。
View.props.onStartShouldSetResponderCapture: (evt) => true,
View.props.onMoveShouldSetResponderCapture: (evt) => true,
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: