在原生的開發中,如果要自定義一些控制項,可能會用到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的屬性存在於 布局引...