react-native拖拽體驗優(yōu)化

this.panResponder = PanResponder.create({
  /***************** 要求成為響應(yīng)者 *****************/
  // 單機手勢是否可以成為響應(yīng)者
  onStartShouldSetPanResponder: (evt, gestureState) => true,
  // 移動手勢是否可以成為響應(yīng)者
  onMoveShouldSetPanResponder: (evt, gestureState) => true,
  // 攔截子組件的單擊手勢傳遞,是否攔截
  onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
  // 攔截子組件的移動手勢傳遞,是否攔截
  onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
  /***************** 響應(yīng)者事件回調(diào)處理 *****************/
  // 單擊手勢監(jiān)聽回調(diào)
  onPanResponderGrant: (e, gestureState) => {
    console.log('onPanResponderGrant==>' + '單擊手勢申請成功,開始處理手勢');
    this._onPanResponderGrant(e);
  },
  // 移動手勢監(jiān)聽回調(diào)
  onPanResponderMove: throttle((e, gestureState) => {
    console.log('onPanResponderMove==>' + '移動手勢申請成功,開始處理手勢' + `${gestureState}`);
    this._onPanResponderMove(e, gestureState);
  }, 200),
  // 手勢動作結(jié)束回調(diào)
  onPanResponderEnd: (evt, gestureState) => {
    console.log('onPanResponderEnd==>' + '手勢操作完成了,用戶離開');
    this._onPanResponderEnd(evt);
  },
  // 手勢釋放, 響應(yīng)者釋放回調(diào)
  onPanResponderRelease: (e, gestureState) => {
    // 用戶放開了所有的觸摸點,且此時視圖已經(jīng)成為了響應(yīng)者嫉到。
    // 一般來說這意味著一個手勢操作已經(jīng)成功完成。
    this._onPanResponderRelease(e, gestureState);
    console.log('onPanResponderRelease==>' + '放開了觸摸,手勢結(jié)束');
  },
  // 手勢申請失敗,未成為響應(yīng)者的回調(diào)
  onResponderReject: (e, gestureState) => {
    // 申請失敗,其他組件未釋放響應(yīng)者
    console.log('onResponderReject==>' + '響應(yīng)者申請失敗');
    this._onPanResponderRelease(e, gestureState);
  },
  // 當(dāng)前手勢被強制取消的回調(diào)
  onPanResponderTerminate: e => {
    // 另一個組件已經(jīng)成為了新的響應(yīng)者局装,所以當(dāng)前手勢將被取消
    console.log('onPanResponderTerminate==>' + '由于某些原因(系統(tǒng)等),所以當(dāng)前手勢將被取消');
    return true;
  },
  onShouldBlockNativeResponder: (evt, gestureState) => {
    return true;
  }
});
  

需求是多個可以拖拽的對象所以需要知道每次是拖拽哪個,而調(diào)用方法需要用 {...this.panResponder.panHandlers}解構(gòu)之后得到的json通過props傳遞給組件座泳,使得組件變成響應(yīng)者呀邢,打印{...this.panResponder.panHandlers}

[圖片上傳失敗...(image-3e7074-1580929245556)]

多個拖拽就不能知道是哪個變成了響應(yīng)者

  1. 不用解構(gòu),給View綁定事件洒沦,傳遞index

Animated.View綁定事件,如

<Animated.View
  onResponderMove={(nativeEvent, gestureState) => this.onResponderMove(index, nativeEvent, gestureState}
>

將index作為參數(shù)傳遞過去就知道是哪項作為了響應(yīng)者价淌,但是申眼,參數(shù)中g(shù)estureState是undefined

[圖片上傳失敗...(image-5cb757-1580929245556)]

官網(wǎng)中說:它提供了一個對觸摸響應(yīng)系統(tǒng)響應(yīng)器的可預(yù)測的包裝瞒津。對于每一個處理函數(shù),它在原生事件之外提供了一個新的gestureState對象括尸。

所以不用PanResponder.create得不到gestureState對象

2.通過重寫解構(gòu)出來的{...this.panResponder}后的onResponderGrant將index放到state中

List.map(li => (
    <Animated.View
      style={styles.scheduleMoveImgView}
      {...this.panResponder.panHandlers}
      onResponderGrant={e => {
        this.touchY = e.nativeEvent.locationY - 12;
        this.initHeight = ((li.end - li.start) / 1800) * initOneHeight;
        this.dragItem = li;
        this.setState({
          isMove: true,
          movingHeight: this.initHeight,
          dragIndex: index
        });
      }}
    >
    </Animated.View>
))

項目中使用了第二種方法巷蚪,因為拖拽時需要得到gestureState對象

[站外圖片上傳中...(image-ff863f-1580929245556)]

<ScrollView
  style={{ flex: 1 }}
  scrollEnabled={!isMove}
  ref={view => {
    this.areaScrollView = view;
  }}
>
    <View style={styles.scheduleList}>
        {
            scheduleList.map((li, index) => ())
        }
    </View>
    <View style={styles.lineWrap}>
        {
            scheduleList.map((li, index) => ())
        }
    </View>
    <View style={styles.scheduleSelectList}>
        {
            scheduleSelectList.map((li, index) => ())
        }
    </View>
</ScrollView>

ScrollView的children有3個View,scheduleList是0-24小時的間距濒翻,lineWrap是今天線屁柏,絕對定位,scheduleSelectList是選中的時間段肴焊,絕對定位前联。

android中的坑

[圖片上傳失敗...(image-8bd84e-1580929245556)]


[圖片上傳失敗...(image-d90c41-1580929245556)]

在android里面只有1/4的區(qū)域能夠點擊,ios沒事娶眷,截圖中綠色和黃色的交界處才能點擊似嗤。原來只有圖標(biāo)能點擊(圓圈灰色X,2424)届宠,在手機中點擊體驗不好烁落,改成黃色區(qū)域能夠點擊(5050),因為黃色刪除按鈕和拖動按鈕都是絕對定位,通過拖動豌注,動態(tài)設(shè)置box(藍色區(qū)域)的height伤塌。

box{
    position: 'absolute',
    top,
    height
}

藍色區(qū)域外的區(qū)域點擊在android中無效

解決方案

<View> // 青色區(qū)域,top - 25, 高度 + 50
    <View></View> // 內(nèi)部邊框區(qū)域 margin 25
</View>

[圖片上傳失敗...(image-6670c6-1580929245556)]

這個時候轧铁,按鈕就在區(qū)域內(nèi)了每聪,可以點擊按鈕全部位置了

接下來就遇到第二個問題

2個box之間間隔一個區(qū)域,這個時候就不能選擇這個區(qū)域了齿风,2個box區(qū)域重疊药薯,上面一個box的高度向下25,下面一個box的top向上25救斑,中間的一個區(qū)域不能點擊

設(shè)置區(qū)域position: 'absolute', zIndex: 100會導(dǎo)致按鈕的3/4能點擊童本,左下角1/4不能點擊問題

[圖片上傳失敗...(image-11774f-1580929245556)]

解決方案

<View> // 一塊區(qū)域
    <View></View> // 不定位
    <View></View> // 定位(寬度80%)
</View>

解決之后

[圖片上傳失敗...(image-7bd580-1580929245556)]

紅色區(qū)域在andriod能點擊選中

但是在ios中紅色區(qū)域是在青色的內(nèi)部(心中感到ios和anroid都有不同的渲染機制,都有坑)脸候,只有設(shè)置外層的View的zIndex: 100大于青色區(qū)域才行穷娱,ios中內(nèi)部View的zIndex是在外層zIndex 的基礎(chǔ)上的。所以方案失敗运沦。(如果設(shè)置外面的View的zIndex: 100,就不能設(shè)置width: 80%泵额, 因為每個區(qū)域都有一個下邊框,80%的話下邊框的長度也變成了80%了携添,可以通過設(shè)置內(nèi)部的View的width為Dimensions.get('window').width*0.8 這時候的下邊框就是一樣了梯刚,最終沒采用這種方案)

最終方案

通過設(shè)置 scheduleList.map((li, index) => ()) 生成不同時間段的高為0.5的下邊框(絕對定位), 內(nèi)部View展示為80%薪寓,效果就是上圖一樣了

rn的體驗等級亡资,能用,湊合向叉,流暢锥腻,絲滑

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市母谎,隨后出現(xiàn)的幾起案子瘦黑,更是在濱河造成了極大的恐慌,老刑警劉巖奇唤,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幸斥,死亡現(xiàn)場離奇詭異,居然都是意外死亡咬扇,警方通過查閱死者的電腦和手機甲葬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懈贺,“玉大人经窖,你說我怎么就攤上這事∷蟛樱” “怎么了画侣?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長堡妒。 經(jīng)常有香客問我配乱,道長,這世上最難降的妖魔是什么皮迟? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任搬泥,我火速辦了婚禮,結(jié)果婚禮上万栅,老公的妹妹穿的比我還像新娘佑钾。我一直安慰自己,他們只是感情好烦粒,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布休溶。 她就那樣靜靜地躺著,像睡著了一般扰她。 火紅的嫁衣襯著肌膚如雪兽掰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天徒役,我揣著相機與錄音孽尽,去河邊找鬼。 笑死忧勿,一個胖子當(dāng)著我的面吹牛杉女,可吹牛的內(nèi)容都是我干的瞻讽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼熏挎,長吁一口氣:“原來是場噩夢啊……” “哼速勇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起坎拐,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烦磁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哼勇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體都伪,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年积担,在試婚紗的時候發(fā)現(xiàn)自己被綠了陨晶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡磅轻,死狀恐怖珍逸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聋溜,我是刑警寧澤谆膳,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站撮躁,受9級特大地震影響漱病,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜把曼,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一杨帽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗤军,春花似錦注盈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至震叮,卻和暖如春胧砰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苇瓣。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工尉间, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓哲嘲,卻偏偏與公主長得像贪薪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子眠副,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345