[React-Native PanResponder拖拽实现]

本文介绍了在React-Native中利用PanResponder处理拖拽操作时遇到的问题和解决方案,包括拖拽与TouchableOpacity点击事件的冲突、与ScrollView手势滑动冲突,以及通过绝对布局和相对布局实现拖拽的示例。文中详细讲解了PanResponder的API和关键参数,如gestureState,用于动态调整组件位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新场景

一个可点击 且可拖拽的按钮, 悬浮于ScrollView 上,
将会面临两个手势冲突
1.拖拽与 TouchableOpacity 的 onPress 问题…
2.拖拽与 ScrollView的手势滑动冲突问题…

补充两个链接:

TouchOpacity 点击事件与 拖拽移动的冲突问题

对于该问题, 可以看这个链接, 上面说的挺好的, 总结一下就是
通过 设置一个 justOnlyTouch 标识, 通过 Math.abs(gestureState.dx) 的移动距离来判断,用户做了移动还是点击

 // 单点手势开始
  _onPanResponderGrant(e: any) {
   
    this.justOnlyTouch = true;
    }
 // 移动手势处理
  _onPanResponderMove(evt: any, g: any) {
   
    //2. 根据触发点计算真实的左侧,顶侧位移变化

    if (Math.abs(g.dx) > 5 && Math.abs(g.dy) > 5) {
   
      this.justOnlyTouch = false;
    } else {
   
      this.justOnlyTouch = true;
    }
    if (!this.justOnlyTouch) {
   
      this.setState({
   
        marginLeft: realMarginLeft,
        marginTop: realMarginTop,
      },)
    }
  }
// 手势结束
  _onPanResponderEnd(evt: any, gestureState: any) {
   
	// 手势结束.判断用户是否仅单点了按钮, 如果是, 则只需点击事件函数即可
    if (this.justOnlyTouch) {
   
      this.setState({
   visible: true});
      return;
    }
   }

================== 2021分割线 == ==========

1.PanResnponder相关Api

    componentWillMount() {
   
        this.panResponder = PanResponder.create({
   

            /***************** 要求成为响应者 *****************/
            // 单机手势是否可以成为响应者
            onStartShouldSetPanResponder: (evt, gestureState) => true,
            // 移动手势是否可以成为响应者
            onMoveShouldSetPanResponder: (evt, gestureState) => true,
            // 拦截子组件的单击手势传递,是否拦截
            onStartShouldSetPanResponderCapture: (evt, gestureState) => true,
            // 拦截子组件的移动手势传递,是否拦截
            onMoveShouldSetPanResponderCapture
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值