TapGestureHandler - react-native

2019-04-03  本文已影响0人  JamesSawyer

文档来源:

分离类型handler, 点击手势用来识别一个或多个手指触摸屏幕。这些手势中涉及的手指不得从初始触摸点显著的移动。可配置的:

例如,可以用来检测是单次点击,还是双击,还是连续3次点击

如果要激活handler,指定的手指的数量必须在适当的时间内以足够短的延迟点击视图达到指定的次数, 当handler被激活了,State立马变为 END 状态, 如果手指移动的距离超过了可允许的距离(allowable distance),则handler会识别失败

属性 (Properties)

属性除了公用属性外,下面是 PanGestureHandler 的特定属性:

事件数据 (event data)

除了基本的event属性,下面是 TapGestureHandler特定的event属性:

示例 多次点击

import React, { PureComponent } from 'react';
import { StyleSheet, View } from 'react-native';
import { LongPressGestureHandler, ScrollView, State, TapGestureHandler } from 'react-native-gesture-handler';

import LoremIpsum from '../common';

const styles = StyleSheet.create({
  scrollView: {
    flex: 1,
    paddingHorizontal: 10,
    paddingVertical: 20,
  },
  box: {
    width: 150,
    height: 150,
    backgroundColor: '#211234',
  }
})

class PressBox extends PureComponent {
  doubleTapRef = React.createRef(); // 只能使用这种方式创建ref
  _onHandlerStateChange = event => {
    if (event.nativeEvent.state === State.ACTIVE) {
      // 如果是激活状态
      alert('按了很长时间了');
    }
  }

  _onSingleTap = event => {
    // event.nativeEvent 打印结果
    // { x: 0,
    // absoluteX: 0,
    // absoluteY: 0,
    // target: 89,
    // handlerTag: 8,
    // y: 0,
    // oldState: 4,
    // numberOfPointers: 0,
    // state: 5 }
    console.log('单次点击 event.nativeEvent', event.nativeEvent);
    if (event.nativeEvent.state === State.ACTIVE) {
      alert('点击了一次');
    }
  }
  
  _onDoubleTap = event => {
    console.log('双击 event.nativeEvent', event.nativeEvent);
    if (event.nativeEvent.state === State.ACTIVE) {
      alert('点击了2次');
    }
  }

  // 单击Handler 使用 waitFor 属性 在 双击Handler 在 'BEGAN' 状态时,是不会被激活的
  render() {
    return (
      <LongPressGestureHandler
        onHandlerStateChange={this._onHandlerStateChange}
        minDurationMs={800}
      >
        <TapGestureHandler
          onHandlerStateChange={this._onSingleTap}
          waitFor={this.doubleTapRef}
        >
          <TapGestureHandler
            ref={this.doubleTapRef}
            onHandlerStateChange={this._onDoubleTap}
            numberOfTaps={2}
          >
            <View style={styles.box} />
          </TapGestureHandler>
        </TapGestureHandler>
      </LongPressGestureHandler>
    )
  }
}


export default class MultiTapExample extends PureComponent {
  render() {
    return (
      <ScrollView style={styles.scrollView}>
        <LoremIpsum words={40} />
        <PressBox />
        <LoremIpsum />
      </ScrollView>
    )
  }
}

这个示例用到的属性和前面的 PanGestureHandler 有点不一样:

上一篇下一篇

猜你喜欢

热点阅读