自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用React Native構(gòu)建類(lèi)似Tinder的加載器

開(kāi)發(fā) 前端
在這篇文章中我會(huì)嘗試描述在React Native中構(gòu)建一個(gè)類(lèi)似Tinder的加載器所遇到的調(diào)整我把它分成三個(gè)挑戰(zhàn)。

在這篇文章中我會(huì)嘗試描述在React Native中構(gòu)建一個(gè)類(lèi)似Tinder的加載器所遇到的調(diào)整我把它分成三個(gè)挑戰(zhàn)。

挑戰(zhàn)1:布局

 

 

 

在上面的截圖中,你可以看到頭像和它后面的圓,都在屏幕正中間。 感謝 Flexbox,通過(guò)添加"justifyContent:'center'"和"alignItems:'center'",可以輕松地將元素水平和垂直居中。在這種情況下,我不得不居中兩個(gè)元素。我可以使用 Flexbox 作為頭像或圓圈。我選擇了頭像。對(duì)于背景圓我使用"position:absolute"和負(fù)邊距來(lái)完成我的目標(biāo)。

  1. container: { 
  2.   flex: 1, 
  3.   justifyContent: 'center', // this centers the avatar vertically 
  4.   alignItems: 'center', // this centers the avatar horizontally 
  5. }, 
  6. circle: { 
  7.   width: circleSize, 
  8.   height: circleSize, 
  9.   position: 'absolute'
  10.   left: deviceWidth/2, 
  11.   top: deviceHeight/2, 
  12.   marginLeft: -circleSize/2, 
  13.   marginTop: -circleSize/2 
  14. } 

挑戰(zhàn)2:動(dòng)畫(huà)

 

 

 

 React Native有一個(gè)動(dòng)畫(huà)庫(kù),稱(chēng)為Animated。我用它來(lái)放大圓圈并將其淡出。如果你知道如何使用 interpolate 方法,并在一個(gè)循環(huán)重復(fù)動(dòng)畫(huà),圓圈的動(dòng)畫(huà)就可以解決了。

我知道,"react-native-animatable"庫(kù)提供了一個(gè)名為"iterationCount:infinitive"的屬性,但是Animated API沒(méi)有內(nèi)置這樣的功能。所以我不得不自己構(gòu)建它。

我的***個(gè)想法是遞歸。我創(chuàng)建了一個(gè)新的函數(shù),它設(shè)置動(dòng)畫(huà)值為零,然后在回調(diào)中把值擴(kuò)展到1,當(dāng)動(dòng)畫(huà)完成后,我再次調(diào)用該函數(shù)。

  1. animate() { 
  2.   this.anim.setValue(0); 
  3.   Animated.timing(this.anim, { 
  4.     toValue: 1, 
  5.     duration: 3000, 
  6.     easing: Easing.in 
  7.   }) 
  8.   .start(this.animate.bind(this)); 
  9.  

雖然它可以工作,并且代碼看起來(lái)挺干凈,但它有一個(gè)問(wèn)題:我不能停止動(dòng)畫(huà),它會(huì)不停的重復(fù)。 我最終使用 setInverval 和 clearInterval 來(lái)創(chuàng)建了一個(gè)能夠被停止的循環(huán)。

挑戰(zhàn)3:交互 

***的挑戰(zhàn)是與頭像的交互。每次你點(diǎn)擊它,一個(gè)新的圓圈會(huì)出現(xiàn),而不會(huì)干擾前一個(gè)。這意味著,屏幕上可能同時(shí)有多個(gè)圓圈。我很快意識(shí)到,當(dāng)前的代碼無(wú)法運(yùn)作。 所以我創(chuàng)建了第二個(gè)組件,它代表一個(gè)單一的圓。每個(gè)圓圈都有自己的"動(dòng)畫(huà)生命周期"。我仍然使用setInterval,但現(xiàn)在它創(chuàng)建一個(gè)新的圓圈,而不是管理動(dòng)畫(huà)。當(dāng)您按下頭像時(shí),會(huì)創(chuàng)建另一個(gè)圓圈。

  1. setCircleInterval() { 
  2.   this.interval = setInterval(this.addCircle, 3000); 
  3.   this.addCircle(); 
  4. addCircle() { 
  5.   this.setState({ 
  6.     circles: [...this.state.circles, this.counter] 
  7.   }); 
  8.    
  9.   this.counter++; 
  10.  

有一件事仍然未處理。只要用戶(hù)按下不動(dòng),新頭像就不再會(huì)被創(chuàng)建,直到在他釋放屏幕之后才創(chuàng)建新的圓圈。 幸運(yùn)的是,Touchable 組件有兩個(gè)事件,它們有助于處理這件事情:onPressIn 和 onPressOut。當(dāng)***個(gè)事件被調(diào)用時(shí),間隔被清除,因此不會(huì)創(chuàng)建任何新的圓,當(dāng)?shù)诙€(gè)事件被觸發(fā)時(shí),將再次設(shè)置間隔(會(huì)再創(chuàng)建圓圈)。

  1. onAvatarPressIn() { 
  2.   clearInterval(this.interval); 
  3. onAvatarPressOut() { 
  4.   this.setCircleInterval(); 
  5.  

結(jié)論

這個(gè)練習(xí)花了一些時(shí)間,我對(duì)結(jié)果很滿(mǎn)意。在 React Native 中創(chuàng)建 UI 非常有趣,我期待著從 React Native 中的流行應(yīng)用程序構(gòu)建其他組件。如果您有任何想法或愿望,請(qǐng)讓我知道!

請(qǐng)查看Github上的完整代碼。

謝謝閱讀!

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2016-08-31 17:03:20

JavascriptReact NativWeb

2017-03-21 21:37:06

組件UI測(cè)試架構(gòu)

2021-09-18 09:00:00

區(qū)塊鏈應(yīng)用JavaScript

2023-09-04 08:32:43

web開(kāi)發(fā)圖像

2016-10-31 11:26:13

ReactRedux前端應(yīng)用

2021-07-25 21:36:24

Windows操作系統(tǒng)功能

2016-10-13 19:01:59

React NativUbuntu

2024-05-15 11:42:33

FlutterWeb 庫(kù)應(yīng)用程序

2016-08-12 08:49:46

React NativFacebookNative

2015-09-22 09:50:36

FacebookAndroid

2017-09-11 14:35:34

編輯器開(kāi)發(fā)環(huán)境React

2016-11-23 16:48:20

react-nativandroidjavascript

2024-07-08 00:00:07

2023-06-24 17:09:06

React前端

2016-08-12 13:55:06

2017-01-04 10:18:00

React NativScrollViewAndroid

2017-01-11 18:44:43

React Nativ觸摸事件Android

2021-05-31 17:37:26

ViteReactesbuild

2021-08-13 07:56:11

App移動(dòng)應(yīng)用

2015-10-10 16:02:36

React NativAndroid
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)