[英]React Native Android FlatList onScroll Animation
[英]OnScroll Fold the View - React Native
我的数学真的很差,我试图计算滚动视图的顶部,因为我希望它位于顶部视图的顶部,以便为滚动视图腾出更多位置。
我知道我可以使用Animate.View
来完成此操作,但由于组件( RecyclerListView
)我无法做到这一点。 所以我的 Idee 在我向下滚动时向上移动组件ItemList
直到-150
,当我向上滚动时,我将移动直到值 scrollY 达到 0。
Stack( 这里) 上已经有一个帖子显示了我想要的内容。
这是我的代码。
<View> this is the View i want to cover/fold <View>
<ItemList style={{top:scrollY}}
onScroll={(nativeEvent, offsetX, offsetY)=>{
// when scroll down, scrollY should not exeede 0
// when i scroll up, scrollY should not be more -150
var maxScroll = 0;
var minScroll = -150;
// How should i calculate and set setScrollY()
}}
columnPerRaw={columnPerRar}
itemHeight={150}
onIni={(s: any) => {
setScroll(s);
}}
onItemPress={(item, index) => itemClick(item as item)}
items={data ?? []}
renderItem={renderItem}
onEndReached={() => {
if (globalContext.value.panination && !isLoading)
setEffectTrigger(Math.random());
}}
keyName="name"
/>
更新
我已经像@Nnay 说的那样做了,但它并不顺利
var maxScroll = 0; // when i scroll up, scrollY should not be more then 0
var minScroll = -150; // when scroll down, scrollY should not exeede -150
var top = lastPos - offsetY;
if (top >minScroll && top <=maxScroll)
setScrollY(top);
lastPos = offsetY;
我已经做到了
无论您选择如何触发此行为(无论是滚动 position 还是滚动方向),您都应该使用条件类。
要获取滚动方向,您需要存储之前的滚动 position。 如果oldPosition - newPosition < 0
您向下滚动,否则您向上滚动。
如果您希望元素的 position 触发它,您应该选择将 boolean 设置为true
或false
,从而触发 class。 就像是:
<View class={{this.show ? 'show' : ''}}>
其中show
是组件本地的 boolean。
然后,您的show
class 可以处理元素的height
,这将自动将以下内容向下推(前提是它不是绝对定位的),您可以通过使用transition: .25s
中的 .25s。 否则会跳
然后,您的滚动处理程序可以根据滚动方向设置 boolean,例如:
this.show = oldPos - newPos > 0;
如果用户向上滚动,这将返回true
,这似乎是您在链接中引用的行为
让我知道这是否满足您的问题,以便我可以相应地编辑和调整答案
ps:如果你只是设置元素的top
,而它有一个 static position,它将不起作用。 它也会跳到那个 position 因为你没有平滑任何东西
编辑:如果 CSS 动画和过渡不起作用并且您不能使用 react-native 的Animate.View
,则不需要外部包的唯一选项是设置间隔 animation 如果 ZB0DF5BC3B30D49BFAEZ72DEC 支持AnimationsAPID492AEZ't8
我还没有尝试在 react-native 中使用 AnimationsAPI,所以我建议先对其进行测试,因为它的性能更高。
如果你想使用间隔 animation,我仍然建议坚持上面的boolean
解决方案,但删除 class 并在<View>
的style
属性中添加一个height
变量
确保将间隔存储在变量中,以便清除它。
if (this.height < 150 /* no idea what height you need, play around */ && show && !this.interval){
this.interval = setInterval(() => {
this.height += 1;
}, 10)
} else if (this.height > 0 && !show && !this.interval) {
this.interval = setInterval(() => {
this.height -= 1;
}, 10)
} else {
clearInterval(this.interval)
}
像这样的东西应该工作。 请记住,我已经好几年没有使用间隔动画了,所以你可能需要使用一些值
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.