import { Dimensions } from 'react-native';
const windowWidth = Dimensions.get('window').width;
export function useSwipe(onSwipeLeft?: any, onSwipeRight?: any, rangeOffset = 4) {
let firstTouch = 0
// set user touch start position
function onTouchStart(e: any) {
firstTouch = e.nativeEvent.pageX
}
// when touch ends check for swipe directions
function onTouchEnd(e: any){
// get touch position and screen size
const positionX = e.nativeEvent.pageX
const range = windowWidth / rangeOffset
// check if position is growing positively and has reached specified range
if(positionX - firstTouch > range){
onSwipeRight && onSwipeRight()
}
// check if position is growing negatively and has reached specified range
else if(firstTouch - positionX > range){
onSwipeLeft && onSwipeLeft()
}
}
return {onTouchStart, onTouchEnd};
}
那么在你的组件中在我的例子中,我将用途:exampleComponent.tsx
导入之前的useSwipe钩子。
将onTouchStart和onTouchEnd事件添加到scrollView。
示例组件
import * as React from 'react';
import { ScrollView } from 'react-native';
import { useSwipe } from '../hooks/useSwipe'
export function ExampleComponent(props: any) {
const { onTouchStart, onTouchEnd } = useSwipe(onSwipeLeft, onSwipeRight, 6)
function onSwipeLeft(){
console.log('SWIPE_LEFT')
}
function onSwipeRight(){
console.log('SWIPE_RIGHT')
}
return (
<ScrollView onTouchStart={onTouchStart} onTouchEnd={onTouchEnd}>
{props.children}
</ScrollView>
);
}
9条答案
按热度按时间lh80um4z1#
我发现
react-native-swipe-gestures
并不稳定(swipes在android上随机工作),react-native-gesture-handler
过于复杂(仅仅添加到项目中就花费了太多精力)。基于Kuza Grave的答案的简化解决方案,谁的解决方案完美且非常简单:
zlhcx6iw2#
我用scrollviews和touch position做了这个简单的解决方案。
它有一个非常干净的实现,没有沉重的组件或外部模块。
您还可以将其用于
<View>
组件,而不是scrollviews。首先,我们创建一个hook:
useSwipe.tsx
那么在你的组件中在我的例子中,我将用途:
exampleComponent.tsx
useSwipe
钩子。onTouchStart
和onTouchEnd
事件添加到scrollView。示例组件
您可以随意使用
offsetRange
属性来处理精度。并修改原始代码,使其与普通类组件一起使用,而不是与钩子一起使用。
cnwbcb6i3#
有一个现有的组件
react-native-swipe-gestures
用于处理上下左右方向的滑动手势,请参见https://github.com/glepur/react-native-swipe-gesturesaiazj4mn4#
可以使用react-native-swipe-gesture。您不需要使用npm安装任何第三方模块。将文件下载到您的项目中,并按照给定的步骤操作
hfwmuf9z5#
如果您使用的是托管的Expo项目,这里有一个记录的手势处理程序:https://docs.expo.io/versions/latest/sdk/gesture-handler/
源代码文档可以在这里找到:https://docs.swmansion.com/react-native-gesture-handler/docs/
对于刷卡,我认为你需要使用
FlingGestureHandler
:https://docs.swmansion.com/react-native-gesture-handler/docs/handler-flinggojuced76#
你可以直接从react-native-gesture-handler link to the docs使用FlingGestureHandler。把你的视野包裹起来。这是你做的。
cyej8jka7#
我正在使用Kuza Grave提供的解决方案,但在三星Galaxy手机上遇到了一个bug,其中
onTouchEnd
没有像预期的那样被触发。我最终使用PanResponder创建了另一个实现。SwipeContainer.tsx
Example.tsx
:omjgkv6w8#
感谢@Nikhil Gogineni!我把他的代码修改成一个没有componentWillMount的功能组件。
SwipeGesture.tsx
而且用法是“同”……感谢Nikhil!
brjng4g39#
我在丹尼尔的答案之上建立了一个简单的例子,使用钩子,并修复了我在Android上遇到的问题,如果在包含Scroll或具有太多指针事件的子屏幕上使用,最终阻止
onTouchEnd
事件被触发。使用像react-native-swipe-gestures这样的库可能是一个很好的选择,但在某些情况下,这已经足够好了,并且避免了额外的第三方依赖。