动画 – React Native粘性行和标题滚动性能?
发布时间:2020-12-15 20:32:15 所属栏目:百科 来源:网络整理
导读:我拼凑了Microsoft Excel的工作版本,如“冻结痛苦”视图.列标题水平滚动内容,行标题垂直滚动内容,但当滚动另一个时,每个标题都“卡在”位置. You can try the working version here. 它不是最佳的,因为如果你停止一个轻弹的滚动或只是滑动很多东西它会口吃.
|
我拼凑了Microsoft Excel的工作版本,如“冻结痛苦”视图.列标题水平滚动内容,行标题垂直滚动内容,但当滚动另一个时,每个标题都“卡在”位置.
You can try the working version here. 该方法使用了几种技术,但导致问题的方法是同步滚动视图. As outlined here,我尝试过设置useNativeDriver:true,这需要改变 我喜欢更优化方法的想法.如何改进? import React from 'react';
import { ScrollView,Animated,Text,View } from 'react-native';
export default class SyncScrollTest extends React.Component {
constructor() {
super();
this.scrollPosition = new Animated.Value(0);
this.scrollEvent = Animated.event(
[{ nativeEvent: { contentOffset: { y: this.scrollPosition } } }],{ useNativeDriver: false },);
}
render() {
return (
<View style={{ flex: 1 }}>
<View style={{ flexDirection: 'row' }}>
<ScrollViewVerticallySynced
style={{ width: 50,marginTop: 60 }}
name="C1"
color="#F2AFAD"
onScroll={this.scrollEvent}
scrollPosition={this.scrollPosition}
/>
<ScrollView horizontal bounces={false}>
<View style={{ width: 600 }}>
<View style={{ height: 60,justifyContent: 'center',backgroundColor: '#B8D2EC' }}>
<Text>
I am Column Header!! I am Column Header!! I am Column Header!! I am Column
Header!! I am Column Header!! I am Column Header!! I am Column Header!!
</Text>
</View>
<ScrollViewVerticallySynced
style={{ width: 600 }}
name="C2"
color="#D9E4AA"
onScroll={this.scrollEvent}
scrollPosition={this.scrollPosition}
/>
</View>
</ScrollView>
</View>
</View>
);
}
}
class ScrollViewVerticallySynced extends React.Component {
componentDidMount() {
this.listener = this.props.scrollPosition.addListener((position) => {
this.instance.scrollTo({
y: position.value,animated: false,});
});
}
render() {
const { name,color,style,onScroll } = this.props;
return (
<ScrollView
key={name}
ref={ref => (this.instance = ref)}
style={style}
scrollEventThrottle={1}
onScroll={onScroll}
bounces={false}
showsVerticalScrollIndicator={false}
>
{someRows(name,25,color)}
</ScrollView>
);
}
}
const someRows = (name,rowCount,color) =>
Array.from(Array(rowCount).keys()).map(index =>
(<View
key={`${name}-${index}`}
style={{
height: 50,backgroundColor: index % 2 === 0 ? color : 'white',flex: 1,alignItems: 'center',}}
>
<Text>
{name} R{index + 1}
</Text>
</View>),);
“` 解决方法
我改变了你的例子,而不是使用监听器和动画事件我使用
ScrollView的scrollTo方法来同步滚动.我认为在滚动时,侦听器是行之间滞后的原因.
您可以测试更改here. import React from 'react';
import { ScrollView,View } from 'react-native';
import { Constants } from 'expo'
export default class SyncScrollTest extends React.Component {
constructor() {
super();
this.c1IsScrolling = false;
this.c2IsScrolling = false;
}
render() {
return (
<View style={{ flex: 1,marginTop: Constants.statusBarHeight }}>
<View style={{ flexDirection: 'row' }}>
<ScrollViewVerticallySynced
style={{ width: 50,marginTop: 60 }}
refe= {ref => (this.c2View = ref)}
name="C1"
color="#F2AFAD"
onScroll={e => {
if (!this.c1IsScrolling) {
this.c2IsScrolling = true;
var scrollY = e.nativeEvent.contentOffset.y;
this.c1View.scrollTo({ y: scrollY });
}
this.c1IsScrolling = false;
}}
/>
<ScrollView horizontal bounces={false}>
<View style={{ width: 400 }}>
<View style={{ height: 60,backgroundColor: '#B8D2EC' }}>
<Text>
I am Column Header!! I am Column Header!! I am Column Header!! I am Column
Header!! I am Column Header!! I am Column Header!! I am Column Header!!
</Text>
</View>
<ScrollViewVerticallySynced
style={{ width: 400 }}
refe= {ref => (this.c1View = ref)}
name="C2"
color="#D9E4AA"
onScroll= {e => {
if (!this.c2IsScrolling) {
this.c1IsScrolling = true;
var scrollY = e.nativeEvent.contentOffset.y;
this.c2View.scrollTo({ y: scrollY });
}
this.c2IsScrolling = false;
}}
/>
</View>
</ScrollView>
</View>
</View>
);
}
}
class ScrollViewVerticallySynced extends React.Component {
render() {
const { name,onScroll,refe } = this.props;
return (
<ScrollView
key={name}
ref={refe}
style={style}
scrollEventThrottle={1}
onScroll={onScroll}
bounces={false}
showsVerticalScrollIndicator={false}
>
{someRows(name,color)}
</ScrollView>
);
}
}
const someRows = (name,);
你可以找到另一个例子here (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
