React native sticky tab吸頂功能
rn的吸頂實現思路和h5不同,且安卓可能有相容性問題
思路一
使用ScrollView的stickyHeaderIndices屬性
- IOS支援,Android不支援
- 吸頂目標需要是Scrollview的第n+1個子節點
<ScrollView
style={ s.container }
onScroll = { this.onScroll }
scrollEventThrottle = {1}
showsVerticalScrollIndicator = { false }
stickyHeaderIndices={[n]} // IOS標題吸頂
>
{ content }
</ScrllView>
思路二
使用Animated+插值運算
- iOS使用原生動畫,效能較好
- 安卓部分app不支援原生動畫,需設定useNativeDriver=false,此時會有相容問題
import { View, Animated, FlatList } from 'react-native'
const AnimatedFlatList = Animated.createAnimatedComponent(FlatList) //使用flatlist需要用Animated包裹一下
state = {
scrollY: new Animated.Value(0)
}
render(){
const HEIGHT = 200
const translateY = this.state.scrollY.interpolate({ //插值運算
inputRange: [-1, 0, HEIGHT, HEIGHT+1],
outputRange: [0, 0, -HEIGHT, -HEIGHT],
})
return (
<Animated.View
style={[{ transform: [{ translateY: translateY }]}]}
>
{ headerContent }
{ stickyContent }
<Animated.ScrollView // 或<AnimatedFlatList />
scrollEventThrottle = {16}
showsVerticalScrollIndicator = {false}
onScroll={ Animated.event([{
nativeEvent: { contentOffset: { y: this.state.scrollY } }
}], {
useNativeDriver: isIOS, // 是否觸發原生動畫
/// listener: (e) => this._onScroll(e),
})
}
>
{ scrollContent }
</Animated.ScrollView>
</Animated.View>
)
}
- 官網介紹:https://reactnative.dev/blog/2017/02/14/using-native-driver-for-animated
- 使用該屬性後,觸發的原生動畫驅動,不會觸發render,達到優化效能的目的
- 官網介紹是支援android的,但是實際我在用的時候設useNativeDriver=true時安卓上沒有transform效果,設為false才有
待解決問題
由於安卓使用的useNativeDriver=false,使得在小米手機上表現不太好,滾動時stickytab會明顯抖動
可優化點:調整flatlist設定、固定上劃高度、改監聽頻率、調整插值運算、發包對比本地執行效果等等
相關文章
- 講講吸頂效果與react-stickyReact
- “吸頂”效果
- 【Android】 banner+tab吸頂+viewpager切換+重新整理載入之實現AndroidViewpager
- [React Native]react-native-scrollabReact Native
- jQuery 頁面滾動 吸頂 和 吸底jQuery
- React Native Icon方案:react-native-svgReact NativeSVG
- 向React Native應用新增螢幕捕捉功能React Native
- React Native轉web方案:react-native-webReact NativeWeb
- React Native 使用 react-native-webview 渲染 HTMLReact NativeWebViewHTML
- 仿京東、淘寶首頁,通過兩層巢狀的RecyclerView實現tab的吸頂效果巢狀View
- react-native配置react-native-image-crop-pickerReact
- React Native選擇器元件-react-native-slidepickerReact Native元件IDE
- react-nativeReact
- React Native 上手React Native
- 《React Native高效開發》之create-react-native-appReact NativeAPP
- React Native / React除錯技巧React Native除錯
- Vue開發——實現吸頂效果Vue
- react native 包學不包會系列--認識react nativeReact Native
- React Native 熱更新React Native
- 詳解 React NativeReact Native
- Redux for react native 指南ReduxReact Native
- 從零開始構建React Native數字鍵盤功能React Native
- 高仿京東Android App,整合React-Native熱更功能AndroidAPPReact
- React-Native ‘WKWebView` has no propType for native propReactWebView
- react/react-native效能優化React優化
- [譯] Airbnb 在 React Native 上下的賭注(四):React Native 退役AIReact Native
- JavaScript tab選項卡功能JavaScript
- React Native --踩坑記 之 建立指定 React Native版本的專案React Native
- React Native 的未來與React HooksReact NativeHook
- React Native 環境搭建React Native
- React Native 整合code pushReact Native
- React-Native爬坑React
- React-Native實踐React
- [譯] 圖解 React Native圖解React Native
- React Native Router Navigations(3)React NativeNavigation
- React Native 初體驗React Native
- React Native 0.59 新特性React Native
- RecyclerView使用指南(五)—— 實現吸頂效果View