最近听喜马拉雅, 发现喜马拉雅的详情滑动卡片效果很赞, 就很想做一个, 然后就用 react native 做了一个类似的.
效果
废话不多说, 先看最终实现的效果
思路
页面组成
- 底部详情介绍页面
- 浮动在底部的菜单栏
- 跟随底部详情页的菜单栏 (此菜单栏和浮动的菜单栏一样)
详情页组成
- app header
- app detail container
- app bottom
- app float menu container
- app detail bottom menu
- app bottom (占位)
- app float menu container(占位高度)
详情页页面种类
- detail container Height < screenHeight - app Header Height
- detail container Height > screenHeight - app Header Height
当中间详情页内容高度小于 屏幕高度- 头部高度时, 需要一个占位的 view 来撑满屏幕1
2
3
4
5{/*当前 stickHeight < scrollMin 高度时, 占位 view , 保证可滑动距离>= scrollMin*/}
{
stickHeight < scrollContainerMinHeight &&
<View style={{height: scrollContainerMinHeight - stickHeight}}/>
}
当滑动距离小于 screenHeight - app header height - app bottom height - app float container Height 时, 显示 float menu1
2
3
4
5{/*当滑动距离scollY < realContainerHeight 时, 占位, 已便让内容能滑动上来*/}
{
isShowFloatMenu &&
<View style={{height: bottomHeight + globalConfig.bookCardPadding}}/>
}
详情页实际 code
1 | <View onLayout={e => { |
手势监听
通过监听手势来改变 float menu 的 translateY 值来实现根据手势滑动移动 float menu
手势滑动 view
1 | import React, {PureComponent} from "react"; |
float menu
1 | /** |
handle move
1 |
|
handle Release
1 | _handleRelease = (gs) => { |
主要是通过 move 传递过来的 dy 值来修改 float menu 的translateY 值
然后释放 release 的时候, 根据当前滑动的位置来更新页面到底是滑到中间 还是头部还是底部,
最后根据父级的 scrollview 的滑动距离来判断是否显示 float menu.