React Native之PanResponder

一、概念

在原生的开发中,如果要自定义一些控件,可能会用到touch相关方法,而React Native也有一套touch机制,说白了就是用JS写了一套方法打通android和ios平台。
PanResponder:可以将多点触摸操作协调成一个手势。它使得一个单点触摸可以接受更多的触摸操作,也可以用于识别简单的多点触摸手势。

二、创建

创建部分代码:

componentWillMount(evt, gestureState){  
    this._panResponder=PanResponder.create({  
      onStartShouldSetPanResponder:this.onStartShouldSetPanResponder,  
      onMoveShouldSetPanResponder:this.onMoveShouldSetPanResponder,  
      onPanResponderGrant:this.onPanResponderGrant,  
      onPanResponderMove:this.onPanResponderMove,  
      onPanResponderRelease:this.onPanResponderEnd,  
      onPanResponderTerminate:this.onPanResponderEnd,  
    });  
  }  

onStartShouldSetPanResponder

用户开始触摸屏幕的时候,是否愿意成为响应者,默认返回false,当返回true的时候则可以进行之后的事件传递。

onMoveShouldSetPanResponder

在每一个触摸点开始移动的时候,再询问一次是否响应触摸交互;

onPanResponderGrant

开始手势操作,也就是说按下去给用户一些视觉反馈(如可以改变颜色)。

onPanResponderMove

最近一次的移动距离.如:(获取x轴y轴方向的移动距离 gestureState.dx,gestureState.dy)。

onPanResponderRelease:

用户放开所有触点,且此时视图已经成为了响应者。

onPanResponderTerminate

另一个组件已经成为了新的响应者,所以当前手势江北取消。

三、实例

功能:可以拖拽的小球,当松开小球的那一刻判断小球是属于屏幕左边还是屏幕右边,属于左边则让小球紧靠屏幕左边,如靠右,则让小球紧靠屏幕右侧。

首先要成为响应者

/* 用户开始触摸屏幕的时候,是否愿意成为响应者 */
onStartShouldSetPanResponders(evt, gestureState){
    return true;
}
/* 在每一个触摸点开始移动的时候,再次询问依次是否响应触摸交互 */
onMoveShouldSetPanResponder(evt, gestureState){
    return true;
}

如果我们要修改点击小球后的颜色可以在onPanResponderGrant方法中处理

/* 开始收拾操作,给用户一些视觉反馈 */
onPanResponderGrant(evt, gestureState){  
  console.log('onPanResponderGrant...');  
 this.setState({  
   style:{  
       backgroundColor:'red',  
       left:_previousLeft,  
       top:_previousTop,  
   }  
 });  
}  
_previousLeft和_previousTop是两个变量,用来记录小球移动坐标

接下来看onPanResponderMove方法

// 最近一次的移动距离为
gestureState.move{X,Y}  
  onPanResponderMove(evt, gestureState){  
     _previousLeft=lastLeft+gestureState.dx;  
     _previousTop=lastTop+gestureState.dy;  
  
     if(_previousLeft<=0){  
       _previousLeft=0;  
     }  
     if(_previousTop<=0){  
       _previousTop=0;  
     }  
     if(_previousLeft>=Util.size.width-CIRCLE_SIZE){  
       _previousLeft=Util.size.width-CIRCLE_SIZE;  
     }  
     if(_previousTop>=Util.size.height-CIRCLE_SIZE){  
       _previousTop=Util.size.height-CIRCLE_SIZE;  
     }  
    //实时更新  
    this.setState({  
      style:{  
          backgroundColor:'red',  
          left:_previousLeft,  
          top:_previousTop,  
      }  
    });  
  }  

当用户松开的onPanResponderRelease回调方法

/* 用户放开了所有的触摸点且此时视图已经成为了响应者
一般来说这意味着一个手势操作已经成功完成。 */
onPanResponderEnd(evt, gestureState){
    lastLeft=_previousLeft;
    lastTop=_previousTop;
    this.changePosition();
}

/* 根据位置做出相应的处理 */
changePosition(){
    if(_previousLeft+CIRCLE_SIZE/2 <= Util.size.width/2){
        _previousLeft=lastLeft=0;  

        this.setState({  
                style:{  
                    left:_previousLeft,  
                    top:_previousTop,  
                    }  
               });   
    }else{  
        _previousLeft=lastLeft=Util.size.width-CIRCLE_SIZE;  
          
        this.setState({  
                    style:{  
                        left:_previousLeft,  
                        top:_previousTop,  
                          }  
                     });
            }
}

运行组件

<View  
      {...this._panResponder.panHandlers}  
      style={[styles.circle,this.state.style]}/>  

三个点就是对象的扩展运算符,说白了就是把panHandlers对象里面所有的属性填充到View中

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
React Native中的VirtualizedList组件是用于高效渲染大量数据的列表视图组件。虚拟化列表在滚动时只加载可见部分的数据,而非一次性渲染所有的列表项,从而提高了性能。 VirtualizedList组件的源码解析可以从以下几个方面进行: 1. 数据源:VirtualizedList接受一个名为data的props,用于表示要渲染的数据源。该数据源可以是一个数组或者是一个带有迭代方法的对象。在源码中,会使用this.props.data来获取传入的数据源。 2. 视图创建:在VirtualizedList组件的源码中,会通过ViewabilityHelper类型来管理可见项和滚动状态。ViewabilityHelper会根据滚动位置计算哪些列表项是可见的,并且会在必要时创建和删除列表项的视图。 3. 渲染性能优化:为了提高滚动的性能,VirtualizedList使用了windowSize属性,该属性定义了可见区域外额外渲染的列表项数量。源码中会根据滚动的位置,动态加载和卸载视图,以保证只渲染用户可见的列表项。 4. 列表项更新:当列表项的数据发生变化时,VirtualizedList会根据数据的变化更新相应的列表项。在源码中,会使用shouldItemUpdate()方法来判断列表项是否需要更新。 5. 交互处理:VirtualizedList会对滚动事件、滚动结束事件等进行处理,以便实现列表的滚动效果。在源码中,会使用onScroll()和onScrollEndDrag()等方法来处理相关交互事件。 总的来说,VirtualizedList作为React Native中高效渲染大量数据的列表视图组件,其源码实现了数据源管理、视图创建和销毁、渲染性能优化、列表项更新、交互处理等功能。通过深入源码的分析,可以更好地了解VirtualizedList组件的工作原理,并能更好地使用和定制该组件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值