加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

#React Native#108<1>手势识别

(2017-11-14 13:50:42)
分类: 计算机相关
http://reactnative.cn/docs/0.44/panresponder.html 这个是官方文档具体方法的描述。
1.PanResponder API 将多种触摸行为协调成一个手势。他的基本思想是:监视屏幕上指定大小、位置的矩形区域,当用手指来按压这个区域中的某个点后,开发者会收到这个事件,当按压后拖动手指时,开发者会收到手势引发的各类事件,当手指离开这个区域时,开发者也会收到相应的事件。
 但是当指定一个区域后,如果该区域的事件没有离开,那么新的手指的触摸事件不会有响应。所以首先要定义指定的监视区域,而且两个监视区域不要有重叠现象。
1.1定义监视器相关变量
指向监视器的变量。必须有。
指向监视器监视区域的变量:可以不定义。
记录监视器区域左上角的顶点坐标的变量:可以不定义。
上一次触摸的纵横坐标:不必定义,但是定义方便分析处理触摸事件。
1.2监视器事件:
onMoveShouldSetPanResponder
onMoveShouldSetPanResponderCapture
onStartShouldSetPanResponder
onStartShouldSetPanResponderCapture
onPanResponderReject
onPanResponderGrant
等13个事件
1.3建立监视器
this._panResponder = PanResponder.create({
      // 要求成为响应者: 
 onStartShouldSetPanResponder: (evt, gestureState) => true,     onStartShouldSetPanResponderCapture: (evt, gestureState) => true,  onMoveShouldSetPanResponder: (evt, gestureState) => true,  onMoveShouldSetPanResponderCapture: (evt, gestureState) => true,
onPanResponderGrant: (evt, gestureState) =>
// 开始手势操作。给用户一些视觉反馈,让他们知道发生了什么事情! 
// gestureState.{x,y}0 现在会被设置为0
      }, 
onPanResponderMove: (evt, gestureState) =>
// 最近一次的移动距离为gestureState.move{X,Y} 
// 从成为响应者开始时的累计手势移动距离为gestureState.d{x,y}
      },   onPanResponderTerminationRequest: (evt, gestureState) => true
onPanResponderRelease: (evt, gestureState) =>
// 用户放开了所有的触摸点,且此时视图已经成为了响应者。

        // 一般来说这意味着一个手势操作已经成功完成。
      }, 
onPanResponderTerminate: (evt, gestureState) =>
// 另一个组件已经成为了新的响应者,所以当前手势将被取消。
      },
onShouldBlockNativeResponder: (evt, gestureState) =>
// 返回一个布尔值,决定当前组件是否应该阻止原生组件成为JS响应者 
// 默认返回true。目前暂时只支持android。 
return true;
      },
    });
  },
render: function() {
    return (
View            {...this._panResponder.panHandlers} />
    );
  },

2.1 监视事件介绍

PanResponder类可以将多点触摸操作协调成一个手势。它使得一个单点触摸可以接受更多的触摸操作,也可以用于识别简单的多点触摸手势。


它提供了一个对触摸响应系统响应器的可预测的包装。对于每一个处理函数,它在原生事件之外提供了一个新的gestureState对象。

onPanResponderMove: (event, gestureState) => {}


原生事件是指由以下字段组成的合成触摸事件:
  • nativeEvent
    • changedTouches - 在上一次事件之后,所有发生变化的触摸事件的数组集合(即上一次事件后,所有移动过的触摸点)
    • identifier - 触摸点的ID
    • locationX - 触摸点相对于父元素的横坐标
    • locationY - 触摸点相对于父元素的纵坐标
    • pageX - 触摸点相对于根元素的横坐标
    • pageY - 触摸点相对于根元素的纵坐标
    • target - 触摸点所在的元素ID
    • timestamp - 触摸事件的时间戳,可用于移动速度的计算
    • touches - 当前屏幕上的所有触摸点的集合

一个gestureState对象有如下的字段:
  • stateID - 触摸状态的ID。在屏幕上有至少一个触摸点的情况下,这个ID会一直有效。
  • moveX - 最近一次移动时的屏幕横坐标
  • moveY - 最近一次移动时的屏幕纵坐标
  • x0 - 当响应器产生时的屏幕坐标
  • y0 - 当响应器产生时的屏幕坐标
  • dx - 从触摸操作开始时的累计横向路程
  • dy - 从触摸操作开始时的累计纵向路程
  • vx - 当前的横向移动速度
  • vy - 当前的纵向移动速度
  • numberActiveTouches - 当前在屏幕上的有效触摸点的数量
2.2 在this.watcher.panHandlers 绑定事件时,尽量写到透明的组件上,并增加其高度,实现容易响应拖拽事件。backgroundColor:'transparent';

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有