ReactNative 觸摸事件處理

ReactNative觸摸事件處理

對RN觸摸事件的捕獲與冒泡機制的理解

組件A、B、C結構

組件A組件B組件C

捕獲、冒泡機制

sequenceDiagram
A->>A: 是否捕獲?若是則停止向下一級傳遞
A->>B: 
B->>B: 是否捕獲?若是則停止向下一級傳遞
B->>C: 
C->>C: 是否捕獲?若是則停止向下一級傳遞
C->>C: 是否聲明成為響應者?無論是否,都冒泡。
C->>B: 
B->>B: 是否聲明成為響應者?無論是否,都冒泡。
B->>A: 
A->>A: 是否聲明成為響應者?

捕獲期可通過onStartShouldSetResponderCapture 或 onMoveShouldSetResponderCapture回調決定是否阻止事件往下級組件傳遞。

冒泡期可通過onStartShouldSetResponder或onMoveShouldSetPanResponder回調決定是否成為響應者。若上級組件與下級組件都返回true,則下級組件成為當前觸摸事件的響應者。(層級越深的組件優先級越高)

補充:

react-native Touch事件的攔截與分發

來自CSDN博文

RN如何處理觸摸事件

View組件的pointerEvents屬性

用于控制當前視圖是否可以作為觸控事件的目標。

  • auto:視圖可以作為觸控事件的目標。
  • none:視圖不能作為觸控事件的目標。
  • box-none:視圖自身不能作為觸控事件的目標,但其子視圖可以。

View組件可用的手勢

onTouchStart={()=>console.log('start')}
onTouchMove={()=>console.log('move')}
onTouchEnd={()=>console.log('end')}

PanResponder 手勢監視器

// 創建監視器
this.panResponder = PanResponder.create({onStartShouldSetPanResponder: ()=>{},...
})// 在View中使用
<View{...this.panResponder}
/>

事件參數

每個事件都有兩個返回參數nativeEvent, gestureState

nativeEvent包含以下屬性

changedTouches - 在上一次事件之后,所有發生變化的觸摸事件的數組集合(即上一次事件后,所有移動過的觸摸點)
identifier - 觸摸點的 ID
locationX - 觸摸點相對于父元素的橫坐標(實踐證明不好用,值會突變!原因未知)
locationY - 觸摸點相對于父元素的縱坐標(實踐證明不好用,值會突變!)
pageX - 觸摸點相對于根元素的橫坐標
pageY - 觸摸點相對于根元素的縱坐標
target - 觸摸點所在的元素 ID
timestamp - 觸摸事件的時間戳,可用于移動速度的計算
touches - 當前屏幕上的所有觸摸點的集合

gestureState包含以下屬性:

stateID 此次觸摸事件的ID
moveX 最近一次移動的屏幕坐標
moveY
x0 響應器產生時的屏幕坐標(手勢第一個坐標)
y0
dx 觸摸開始累積的橫向路程
dy
vx 當前的橫向移動速度
vy
numberActiveTouches 觸摸點數量

事件生命周期

單點事件

onStartShouldSetResponderCapture 如果父視圖想要阻止子視圖響應 touch start 事件,它就應該設置這個方法并返回 true。

onStartShouldSetResponder 在用戶開始觸摸的時候(手指剛剛接觸屏幕的瞬間),返回是否愿意成為響應者

onPanResponderGrant 這個視圖開始響應觸摸事件。此時需要高亮告訴用戶正在響應。

onPanResponderStart 觸摸事件正式被監視

onPanResponderEnd 觸摸事件結束

onPanResponderRelease 在整個觸摸事件結束時調用這個函數。

移動事件

onMoveShouldSetResponderCapture 如果父視圖想要阻止子視圖響應 touch move 事件時,它就應該設置這個方法并返回 true

onMoveShouldSetPanResponder 這個視圖想要“認領”這個 touch move 事件嗎?每當有 touch move 事件在這個視圖中發生,并且這個視圖沒有被設置為這個 touch move 的響應時,這個函數就會被調用。

onPanResponderGrant 監視器發出通知開始工作

onPanResponderMove 當用戶正在屏幕上移動手指時調用這個函數。

異常事件

onPanResponderReject 有一個響應器正處于活躍狀態,并且不會向另一個要求響應這個事件的視圖釋放這個事件。

onPanResponderTerminationRequest 其他某個視圖想要成為事件的響應者,并要求這個視圖放棄對事件的響應時,就會調用這個函數。如果允許釋放響應,就返回true。

onPanResponderTermination 響應被從這個視圖上“劫走”了。可能是在調用了 onResponderTerminationRequest 之后,被另一個視圖“劫走”了(見 onresponderterminationrequest), 也可能是由于 OS 無條件終止了響應(比如說被 iOS 上的控制中心/消息中心)

轉載于:https://www.cnblogs.com/foxNike/p/11119204.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CISCO網絡故障排錯命令總結分享

一、故障處理命令 1、show命令&#xff1a; 1&#xff09; 全局命令&#xff1a; show version &#xff1b;顯示系統硬件和軟件版本、DRAM、Flash show startup-config &#xff1b;顯示寫入NVRAM中的配置內容 show running-config &#xff1b;顯示當前運行的配置內容 show b…

java input回車,用java怎樣編寫加減乘除,從鍵盤輸入,例如:1+2按回車得到

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓import org.junit.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class TestCalc {Testpublic void testCalculator() {String input "11";//輸入String rule "(\\d\\.?\\d*)([\\…

Java中數組在內存中的存放原理?

版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載。 https://blog.csdn.net/yangyong0717/article/details/79165685Java中數組被實現為對象&#xff0c;它們一般都會因為記錄長度而需要額外的內存。對于一個原始數據類型的數組&#xff0c;一般需要24…

程序員如何面試才能拿到offer

一、概述 面試&#xff0c;難還是不難&#xff1f;取決于面試者的底蘊&#xff08;氣場技能&#xff09;、心態和認知及溝通技巧。面試其實可以理解為一場聊天和談判&#xff0c;在這過程中有心理、思想上的碰撞和博弈。其實你只需要搞清楚一個邏輯&#xff1a;“面試官為什么會…

php 跨區域,如何構造PHP的內容包括在非安全(http://)和安全(https://)區域以及跨多個目錄使用?...

只需使用//example.com/foo.blah即可.< img id “sample-image”src “// /media/sample-image.png”/>很明顯,HTTP是協議,但存在其他協議,如GOPHER,HTTPS,FTP等……而不是在gopher URL gopher&#xff1a;//example.com上,您只需鏈接到//example.com,協議就可以在沒有它…

Generative Adversarial Learning Towards Fast Weakly Supervised Detection(CVPR2018)閱讀筆記

弱監督目標檢測相對于一般的目標檢測任務來說&#xff0c;訓練樣本不需要實例級別的標注&#xff0c;只需要圖片級別的標注&#xff0c;即告訴圖片中有什么而不需標注位置信息&#xff0c;這種標注圖片容易獲取&#xff0c;能節省標注時間及精力。現有的大部分方法在進行若監督…

如何添加JWT生成的token在請求頭中

前言 在我們使用JWT來做用戶的驗證時&#xff0c;我們登陸生成對應的token,并加入到請求的參數中發送到后臺提供相關的權限校驗。這個時候我們需要使用到傳遞請求頭參數傳遞的問題&#xff0c;下面是兩種方式。 1.ajax提交方式 1&#xff09;.方法一&#xff1a; $.ajax({ type…

Gradle 使用技巧(二) - SO/NDK過濾

引言 作為一個Android開發人員&#xff0c;so對于我們來講是極其常見的&#xff0c;各種大廠的SDK中都包含著各種各樣的so&#xff0c;而so也是apk瘦身的重要一環&#xff0c;減少so平臺的數量&#xff0c;可以極大限度的減少apk的大小。 Android 中的so 先看一張官方的圖&…

java兩個數之間質數求法,求任意兩個整數之間質數的個數的代碼!!!(新手編寫)...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓/*** Title:Calculate acount of prime number between preNum and rearNum;* Author: public* Time&#xff1a;2008.12.5 21:09:35*/import java.awt.*;import java.awt.event.*;class Arithmetic{//將計算質數個數的類封裝在此類…

VMware——安裝CentOS

VMware——安裝CentOS 摘要&#xff1a;本文主要記錄了在VMware虛擬機里安裝CentOS的步驟。 下載操作系統 可以從下面的鏡像地址去下載各種版本的CentOS&#xff0c;此次安裝使用的版本是7.2&#xff1a; http://archive.kernel.org/centos-vault/ http://mirror.nsc.liu.se/ce…

django1.4.9 OMserverweb站點管理

1.項目setting.py配置&#xff1a; 2.項目url.py配置&#xff1a; 錯誤提示&#xff1a;auth_user這個表沒有創建&#xff0c;那個因為,admin站點默認數據表需要遷移。執行python manage.py syncdb 會創建所有應用程序需要的數據庫表4.接下來就是根據要求一步一步來&#xff1a…

matlab讀取氣象數據,基于MATLAB實現3種氣象數據的讀取和繪圖

第 29卷第 4期 2007年 11月 廣 東 氣 象 GuangdongMeteorology Vol. 29  No. 4 November 2007 基于 MATLAB實現 3種氣象數據的讀取和繪圖 劉  峰 , 劉  娟 , 李  萍 , 林  智 (民航中南空中交通管理局氣象中心 ,廣東廣州  510406)   摘  要 :針對 M ICAPS、 GR IB和…

[USACO17JAN]Promotion Counting 題解

前言 巨佬說:要有線段樹&#xff0c;結果蒟蒻打了一棵樹狀數組... 想想啊&#xff0c;奶牛都開公司當老板了&#xff0c;我還在這里碼代碼&#xff0c;太失敗了。話說奶牛開個公司老板不應該是FarmerJohn嗎&#xff1f; 題解 剛看到這道題的時候竟然沒有想到深搜&#xff0c;然…

牛客小白月賽6 水題 求n!在m進制下末尾0的個數 數論

鏈接&#xff1a;https://www.nowcoder.com/acm/contest/135/C來源&#xff1a;牛客網 題目描述 其中&#xff0c;f(1)1;f(2)1;Z皇后的方案數&#xff1a;即在ZZ的棋盤上放置Z個皇后&#xff0c;使其互不攻擊的方案數。 輸入描述: 輸入數據共一行&#xff0c;兩個正整數x,m&am…

centos php7 apcu,centos php5.4 升級 php7

接上篇&#xff0c;edusoho需要php5.5以上版本&#xff0c;于是需要升級本地phpphp是通過yum默認安裝的。以下安裝參考 linkhttps://blog.csdn.net/u012569217/article/details/77506902因此先查看本地php版本php -v檢查當前php的安裝包yum list installed | grep php將本地php…

子類訪問父類和方法覆寫

子類不能直接訪問父類的私有成員&#xff1b; 但是子類可以調用父類中的非私有方法來間接訪問父類的私有成員。 Person類中有私有字段name,Student繼承Person new Sudent().name; new Student().getName(); √ 子類拓展父類&#xff08;子類是父類的一種特殊…

面向對象筆試題練習一

1.接口只能被類實現&#xff0c;類不能繼承接口&#xff0c;遵循單繼承多實現原則&#xff1b; 2.靜態方法中不能引用其外部的非靜態成員&#xff1b; 3.實現 Runnable 接口&#xff0c;接口中有一個抽象方法 run&#xff0c;實現類中重寫該方法&#xff1b; 4.public修飾的方法…

curl 升級 php,將命令行cURL轉換為PHP cURL

我從來沒有做過任何卷曲&#xff0c;所以需要一些幫助。我試圖從例子中解決這個問題&#xff0c;但無法理解它&#xff01;我有一個curl命令&#xff0c;我可以從linux(ubuntu)命令行成功運行&#xff0c;該命令行通過api將文件放入wiki。我需要將這個curl命令合并到我正在構建…

VM-ESXI 相關常用命令(Updateing)

# ESXI計劃任務路徑&#xff1a;cat /var/spool/cron/crontabs/root # 獲取虛擬機列表vim-cmd vmsvc/getallvms獲取vm狀態vim-cmd vmsvc/power.getstat [vmid]關閉虛機vim-cmd vmsvc/power.shutdown [vmid]vim-cmd vmsvc/power.off [vmid] # 強制關閉長期腳本存放路徑 vi /etc/…

sql server中的go

1. 作用:向 SQL Server 實用工具發出一批 Transact-SQL 語句結束的信號.2. 語法:一批 Transact-SQL 語句GO如Select 1Select 2Select 3GO3. 說明:1) GO 不是 Transact-SQL 語句&#xff1b;2) 它是 sqlcmd 和 osql 實用工具以及 SQL Server Management Studio 代碼編輯器識別的…