微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 React Native 构建类似 Tinder 的加载器

在这文章中我会尝试描述在React Native中构建一个类似Tinder的加载器所遇到的调整
我把它分成三个挑战。

挑战1:布局

在上面的截图中,你可以看到头像和它后面的圆,都在屏幕正中间。
感谢 FlexBox,通过添加"justifyContent:'center'"和"alignItems:'center'",可以轻松地将元素水平和垂直居中。在这种情况下,我不得不居中两个元素。我可以使用 FlexBox 作为头像或圆圈。我选择了头像。对于背景圆我使用"position:absolute"和负边距来完成我的目标。

container: {
  flex: 1,justifyContent: 'center',// this centers the avatar vertically
  alignItems: 'center',// this centers the avatar horizontally
},circle: {
  width: circleSize,height: circleSize,position: 'absolute',left: deviceWidth/2,top: deviceHeight/2,marginLeft: -circleSize/2,marginTop: -circleSize/2
}

挑战2:动画

React Native有一个动画库,称为Animated。我用它来放大圆圈并将其淡出。如果你知道如何使用 interpolate 方法,并在一个循环重复动画,圆圈的动画就可以解决了。
我知道,"react-native-animatable"库提供了一个名为"iterationCount:infinitive"的属性,但是Animated API没有内置这样的功能。所以我不得不自己构建它。
我的第一个想法是递归。我创建了一个新的函数,它设置动画值为零,然后在回调中把值扩展到1,当动画完成后,我再次调用函数

animate() {
  this.anim.setValue(0);
  Animated.timing(this.anim,{
    tovalue: 1,duration: 3000,easing: Easing.in
  })
  .start(this.animate.bind(this));
}

虽然它可以工作,并且代码看起来挺干净,但它有一个问题:我不能停止动画,它会不停的重复。
我最终使用 setInverval 和 clearInterval 来创建了一个能够被停止的循环。

挑战3:交互

最后的挑战是与头像的交互。每次你点击它,一个新的圆圈会出现,而不会干扰前一个。这意味着,屏幕上可能同时有多个圆圈。我很快意识到,当前的代码无法运作。
所以我创建了第二个组件,它代表一个单一的圆。每个圆圈都有自己的"动画生命周期"。我仍然使用setInterval,但现在它创建一个新的圆圈,而不是管理动画。当您按下头像时,会创建另一个圆圈。

setCircleInterval() {
  this.interval = setInterval(this.addCircle,3000);
  this.addCircle();
}
addCircle() {
  this.setState({
    circles: [...this.state.circles,this.counter]
  });
  
  this.counter++;
}

有一件事仍然未处理。只要用户按下不动,新头像就不再会被创建,直到在他释放屏幕之后才创建新的圆圈。
幸运的是,Touchable 组件有两个事件,它们有助于处理这件事情:onPressIn 和 onPressOut。当第一个事件被调用时,间隔被清除,因此不会创建任何新的圆,当第二个事件被触发时,将再次设置间隔(会再创建圆圈)。

onAvatarPressIn() {
  clearInterval(this.interval);
}
onAvatarPressOut() {
  this.setCircleInterval();
}

结论

这个练习花了一些时间,我对结果很满意。在 React Native 中创建 UI 非常有趣,我期待着从 React Native 中的流行应用程序构建其他组件。如果您有任何想法或愿望,请让我知道!

请查看Github上的完整代码

谢谢阅读!

原文作者:Yousef Kama 原文链接http://t.cn/RtnSJwA
翻译自力谱宿云LeapCloud旗下MaxLeap团队_UX成员:Jason
本文首发自MaxLeap官网:https://maxleap.cn/ 欢迎关注微信公众号:MaxLeap_yidongyanfa

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...