RN中移動元件開發

2022-02-02 04:40:06 字數 2108 閱讀 2569

在原生的開發中,如果要自定義一些控制項,可能會用到touch的相關方法,而react native也有一套touch機制,說白了就是用js寫了一套方法打通android和ios平台,這裡簡單講解下react native(rn)的touch機制,這裡先不過多深入研究,先熟悉下流程,至於rn的touch分發機制之後再詳細講解.

下面來看下如何建立:

componentwillmount(evt, gesturestate));

}上面**相對比較清晰,至於為什麼,這裡我貼部分原始碼看下你就豁然明朗啦,,

具體的作用這裡簡單說明下:

onstartshouldsetpanresponder:使用者開始觸控螢幕的時候,是否願意成為響應者;預設返回false,無法響應,當返回true的時候則可以進行之後的事件傳遞。

onmoveshouldsetpanresponder:在每乙個觸控點開始移動的時候,再詢問一次是否響應觸控互動;

onpanrespondergrant:開始手勢操作,也可以說按下去。給使用者一些視覺反饋,讓他們知道發生了什麼事情!(如:可以修改顏色)

onpanrespondermove:最近一次的移動距離.如:(獲取x軸y軸方向的移動距離 gesturestate.dx,gesturestate.dy)

onpanresponderrelease:使用者放開了所有的觸控點,且此時檢視已經成為了響應者。

onpanresponderterminate:另乙個元件已經成為了新的響應者,所以當前手勢將被取消。

下面以乙個簡單的例子跑下整個流程。

功能:可以拖拽的小球,當鬆開那一刻判斷小球是屬於螢幕左邊還是螢幕右邊,屬於左邊則讓小球緊靠螢幕左邊,如靠螢幕右側,則讓小球緊靠螢幕右側。

首先要成為響應者:

//使用者開始觸控螢幕的時候,是否願意成為響應者;

onstartshouldsetpanresponder(evt, gesturestate)

//在每乙個觸控點開始移動的時候,再詢問一次是否響應觸控互動;

onmoveshouldsetpanresponder(evt, gesturestate)

比如我要門要修改點選小球後的顏色,可以在onpanrespondergrant方法中處理:

// 開始手勢操作。給使用者一些視覺反饋,讓他們知道發生了什麼事情!

onpanrespondergrant(evt, gesturestate)

});}

_previousleft和_previoustop是兩個變數,用來記錄小球移動座標

接下來我們看下onpanrespondermove方法:

// 最近一次的移動距離為gesturestate.move

onpanrespondermove(evt, gesturestate)

if(_previoustop<=0)

if(_previousleft>=util.size.width-circle_size)

if(_previoustop>=util.size.height-circle_size)

//實時更新

this.setstate(

});}

主要是限制小球拖拽移動的時候不許出螢幕外部。

最後來看下當使用者鬆開的onpanresponderrelease**方法:

// 使用者放開了所有的觸控點,且此時檢視已經成為了響應者。

// 一般來說這意味著乙個手勢操作已經成功完成。

onpanresponderend(evt, gesturestate)

/**根據位置做出相應處理

**/changeposition()

});}else

});}

}主要就是判斷下釋放的那一刻,所處的位置,若屬於左側則置left=0,為右側則至left=util.size.width-circle_size;

一切準備就緒,最後看我們如何運用在元件上吧,非常的簡單:

這三個點其實就是物件的擴充套件運算子,說白了就是把panhandlers物件裡面所有的屬性填充到view中。通過原始碼我們也可以知道view中其實定義了一系列相關的屬性:

proptypes:

到這裡就結束了,整體上還算不複雜,就幾個**函式記住了就可以了。

最後看下效果圖吧:

此外附上 官方示例元件:

Vue 元件中 移動 this el 的注意事項

比如,這幾行 會導致 dom 元素位置 與 vnode 期望的位置不一致 比如 父元件 div id p h1 第1個 button click add 新增 p v for item,index in list key index 第 個元素 ccc js部分methods 子元件 ccc js部...

RN開發環境

rn完整原生環境 開發平台 macos 目標平台 ios 依賴增量包 node watchman reactnative命令列工具 xcode 終端指令 brew install node brew upgrade node brew install watchman sudo chown r wh...

android開發 13 嘗試在流布局中移動控制項

我們常用的linearlayout,等都屬於流布局,在流布局中如何移動控制項呢?我決定做個嘗試。雖然可以使用絕對布局,但我不傾向使用這個布局。那麼看看我的方式吧。記得margin這個屬性嗎,我們就用來它來控制控制項的位置,改動它的值將會產生移動的效果。如上面的 所示,margin的屬性存在於 布局引...