博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React Native下拉图片放大动画
阅读量:4087 次
发布时间:2019-05-25

本文共 2701 字,大约阅读时间需要 9 分钟。

# interpolate

插值动画,可以实现分段动画,绑定到event上非常流畅

  1. 下拉放大,上拉变成导航栏动画

     

    2.gif

'use strict';// 图片高度为255class Demo extends Component {  constructor(props) {    super(props);    this.state = {      scrollY: new Animated.Value(0),      viewRef: null    }  }  _renderHeaderParallaxImage() {    const {scrollY} = this.state    let translateY    if (Platform.OS == 'ios') {      translateY = scrollY.interpolate({        inputRange: [255 - 64 + 50, 255 + (64 - 50), 255 + (64 - 50)],         outputRange: [255, 255 - 30, 255 - 30],      })    } else {      translateY = scrollY.interpolate({        inputRange: [255 - 44 + 30 + 20, 255 - 30 + 44 + 20, 255 - 30 + 44 + 20],        outputRange: [255, 255 - 30, 255 - 30],      })    }    return (      
this.setState({viewRef: findNodeHandle(this.refs.backgroundImage)})} // for android blur ref='backgroundImage' pointerEvents='none' style={[styles.postParallaxImage, { height: 255, transform: [{ translateY: scrollY.interpolate({ inputRange: [-255, 0, 255 - NavHeight, 255], outputRange: [255 / 2, 0, -(255 - NavHeight), -(255 - NavHeight)], }) }, { scale: scrollY.interpolate({ inputRange: [-255, 0, 255], outputRange: [2, 1, 1], // -255: 2, 0: 1, 255: 1 当scrollY在-255到0时,scale按照2-1的动画运动;当scrollY在0-255时,scale不变。可以输入任意数量对应的值,但必须是递增或者相等 }) }] }]} source={
{uri: IMAGE_URL}} >
'标题'
) } render() { return (
{/* 图片放在最下层,listiview的marginTop需要留出64的空白用来显示图片变成的nav bar*/} {/* 正常的逻辑是把拉伸图放在listView之上,这里为了显示refreshControl,把拉伸图的层次放在listView之下,所以在listView上放了一个高度为导航栏的空白view。 */} {this._renderHeaderParallaxImage()} {/* 不可以为listView的style加marginTop,在android上如果有refreshControl会在顶部有高度为44的空白 */}
} renderHeader={
} style={
{backgroundColor: 'transparent'}} // 因为层次原因,防止把header遮住 renderRow={
} // renderRow需要背景色,把title遮住,并且不能设置margin(可以外面套一个大的view,在里面margin) // 把Animated.event绑定到onScroll或者手势中 onScroll={Animated.event([{nativeEvent: {contentOffset: {y: this.state.scrollY}}}])} // 或者 onScroll={(e) => { Animated.event([{nativeEvent: {contentOffset: {y: this.state.scrollY}}}]) .call(this, e) }} />
); }}

2.下拉放大,上拉视差效果

 

3.gif

// 如果要视差效果,拉伸图的层次应该在listView之下,让拉伸图不遮挡listView的显示,同时listView的header设置为透明色高度为拉伸图的高度,其他地方设置为纯色,把拉伸图挡住

 

作者:阳光下慵懒的驴
链接:https://www.jianshu.com/p/0e2785b0cde1
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的文章
一些宏定义
查看>>
iOS工程打包 identify not found解决办法
查看>>
iOS开发,定时器的使用
查看>>
"xxx was built without full bitcode" 编译错误解决
查看>>
iOS开发-关于UI界面未能铺满全屏的问题
查看>>
iOS之StatusBar
查看>>
极光推送 xcode8 运行到iOS10系统, 报: NSCocoaErrorDomain Code=3000
查看>>
StoryBoard中设置TabBar被选中的颜色
查看>>
视图控制器push下一级控制器, 下级视图向下偏移64
查看>>
StoryBoard中tableview约束被误删的后果
查看>>
使用SDCycleScrollvVew出现的错误
查看>>
window模态导航控制器出现的问题 "whose view is not in the window hierarchy!"
查看>>
Mac / Xcode 常用快捷键
查看>>
iOS开发 Xcode插件
查看>>
Xcode上运行模拟器,无法启用模拟器问题(Unable to the boot Simulator)
查看>>
【LintCode 简单】41. 最大子数组
查看>>
【LintCode 简单】35. 翻转链表
查看>>
【LintCode 简单】165. 合并两个排序链表
查看>>
【LintCode 简单】112. 删除排序链表中的重复元素
查看>>
【LintCode 简单】93. 平衡二叉树
查看>>