我目前正在使用这个模块。https:/github.commxmzbreact-native-gesture-detector。. 我希望能够从创建的点中画出一条线,但是,它似乎只能输出圆圈。
它有一个 "创建手势 "视图。
<View style={{ position: "relative", width: "100%", height: "100%" }}>
<GesturePath
path={gesture.map(coordinate => {
if (recorderOffset) {
return {
x: coordinate.x + recorderOffset.x,
y: coordinate.y + recorderOffset.y,
};
}
return coordinate;
})}
color="green"
slopRadius={30}
center={false}
/>
</View>
GesturePath是这样定义的
const GesturePath = ({ path, color, slopRadius, center = true }: GesturePathProps) => {
const baseStyle: ViewStyle = {
position: "absolute",
top: center ? "50%" : 0,
left: center ? "50%" : 0,
opacity: 1,
};
return (
<>
{path.map((point, index) => (
<Animated.View
style={Object.assign({}, baseStyle, {
width: slopRadius,
height: slopRadius,
borderRadius: slopRadius,
backgroundColor: color,
marginLeft: point.x - slopRadius,
marginTop: point.y - slopRadius,
})}
key={index}
/>
))}
</>
);
};
当你在该视图上画画时,它会用点勾勒出路径,就像这样。
我希望它是一条平滑的线,而不是上图中的一系列圆圈。
你需要像Canvas这样的东西来绘制线条而不是像素(用Views)。React Native目前没有Canvas的实现。
在expo中最简单的方法是使用 react-native-svg
库。
使用该库,你可以通过以下实现从你的手势数据中绘制一条多段线。
import Svg, { Polyline } from 'react-native-svg';
const GesturePath = ({ path, color }) => {
const { width, height } = Dimensions.get('window');
const points = path.map(p => `${p.x},${p.y}`).join(' ');
return (
<Svg height="100%" width="100%" viewBox={`0 0 ${width} ${height}`}>
<Polyline
points={points}
fill="none"
stroke={color}
strokeWidth="1"
/>
</Svg>
);
};
你也可以在不使用手势库的情况下记录手势 react-native-gesture-detector
库,通过使用内置的React Native PanResponder. 这里是一个例子。
const GestureRecorder = ({ onPathChanged }) => {
const pathRef = useRef([]);
const panResponder = useRef(
PanResponder.create({
onMoveShouldSetPanResponder: () => true,
onPanResponderGrant: () => {
pathRef.current = [];
},
onPanResponderMove: (event) => {
pathRef.current.push({
x: event.nativeEvent.locationX,
y: event.nativeEvent.locationY,
});
// Update path real-time (A new array must be created
// so setState recognises the change and re-renders the App):
onPathChanged([...pathRef.current]);
},
onPanResponderRelease: () => {
onPathChanged(pathRef.current);
}
})
).current;
return (
<View
style={StyleSheet.absoluteFill}
{...panResponder.panHandlers}
/>
);
}
请看这个小吃,它是一个将所有东西联系在一起的工作App: https:/snack.expo.io@mtkoponedraw-gesture-path。