ReactNative中的手势响应系统


本人邮箱: [lihao_iOS@hotmail.com](mailto: lihao_iOS@hotmail.com),欢迎交流讨论.
欢迎转载:转载请注明网址:http://dwz.cn/3H9kbR
Github地址: https://github.com/eggswift/


Touchable

具体实现在ResponderEventPlugin.js,reactNative为我们提供了Touchable实现。

能做什么

  • 反馈/高亮:让用户看到他们到底按到了什么东西,以及松开手后会发生什么。
  • 取消功能:当用户正在触摸操作时,应该是可以通过把手指移开来终止操作。

TouchableHighlight

本组件用于封装视图。当按下时封装的视图的不透明度会降低,同时会有一个底层的颜色透过而被用户看到,使得视图变暗或变亮。在底层实现上,实际会创建一个新的视图到视图层级中,如果使用的方法不正确,有时候会导致一些不希望出现的视觉效果。譬如没有给视图的backgroundColor显式声明一个不透明的颜色。

注意:TouchableHighlight只支持一个子节点,如果你需要设置多个子视图组件,就需要使用View节点进行包装。

属性

名称 注释
view#style 支持所有view#style属性
TouchableWithoutFeedback 支持TouchableWithoutFeedback 的所有属性
activeOpacity 高亮时view的不透明度。
onHideUnderlay 高亮隐藏时回调。
onShowUnderlay 高亮显示时回调。
underlayColor 高亮颜色

TouchableWithoutFeedback

你不需要主动去继承或直接使用TouchableWithoutFeedback组件。任何能够响应触摸或者点击的控件都应该有视觉上的反应效果。TouchableWithoutFeedback并不支持任何视觉反馈,这就是一个很大的原因,看起来像Web效果而不是原生的效果(Native)。

名称 类型 注释
accessibilityComponentType View.AccessibilityComponentType 设置可访问的组件类型
accessibilityTraits View.AccessibilityTraits 设置访问特征
accessible bool 设置当前组件是否可以访问
delayLongPress number 设置延迟的时间,单位为毫秒。从onPressIn方法开始,到 onLongPress被调用这一段时间
delayPressIn number 设置延迟的时间,单位为毫秒,从用户触摸控件开始到onPressIn被调用这一段时间
delayPressOut number 设置延迟的时间,单位为毫秒,从用户触摸事件释放开始到onPressOut被调用这一段时间
onLayout function 当组件加载或者改组件的布局发生变化的时候调用。调用传入的参数为{nativeEvent:{layout:{x,y,width,height}}}
onLongPress function 当用户长时间按压组件(长按效果)的时候调用该方法
onPress function 当用户点击的时候调用(触摸结束)。 但是如果事件被取消了就不会调用。(例如:当前被滑动事件所替代)
onPressIn function 用户开始触摸组件回调方法
onPressOut function 用户完成触摸组件之后回调方法
pressRetentionOffset {top: ,left: ,bottom: ,right: } 该设置当视图滚动禁用的情况下,可以定义当手指距离组件的距离。当大于该距离该组件会失去响应。当少于该距离的时候,该组件会重新进行响应。确保你传入一个常量来减少内存分配。

注意:TouchableWithoutFeedback 和 TouchableHighlight 一样只支持一个子节点,如果你需要设置多个子视图组件,就需要使用View节点进行包装。

示例


/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View,
    Touchable,
    TouchableHighlight,
    TouchableNativeFeedback,
    TouchableWithoutFeedback,
    TouchableOpacity,
} from 'react-native';

class GestureDemo extends Component {

  render() {
    return (
      <View style = {styles.container}>
        <TouchableHighlight style={styles.touchable}
                            activeOpacity={0.3}
                            underlayColor={'#FF00FF'}
                            onPressIn={this._onPressIn}
                            onPressOut={this._onPressOut}
                            onPress={this._onPress}
                            onLongPress={this._onLongPress}>
          <View style={styles.button}></View>
        </TouchableHighlight>
      </View>
    );
  }

  _onPressIn() {
    this.start = Date.now()
    console.log("press in")
  }
  _onPressOut() {
    console.log("press out")
  }
  _onPress() {
    console.log("press")
  }
  _onLongPress() {
    console.log("press long" + (Date.now() - this.start))
  }
}

const styles = StyleSheet.create({
    container: {
      flex: 1,
      justifyContent: 'center',
      alignItems: 'center',
      backgroundColor: '#F5F5F5',
    },
    button: {
      width: 160,
      height: 160,
    },
    touchable: {
      backgroundColor: 'red',
      shadowColor: 'black',
      shadowRadius: 10,
      shadowOpacity: 0.3,
      shadowOffset: {width: 2, height: 2},
    },
});

AppRegistry.registerComponent('GestureDemo', () => GestureDemo);


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Touchable系列组件 为了能让视图能够响应用的的点击事件,我们需要借助Touchablexxx组件,来包裹我...
    基本密码宋阅读 5,616评论 0 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,846评论 25 708
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,910评论 1 22
  • <1> 第一次自己出来租房子,刚好可以实现装修房间的小愿望。从八月底拿到这两室一厅的钥匙,两室一厅一厨一卫,全部都...
    DaisRoy阅读 329评论 0 0
  • 你坐在落叶堆上, 被果子砸醒了臆想。 你不曾忘记, 当他看到你,毫无思索,径直走来。 这埋葬岁月的六捧土, 恰如,...
    季熙河阅读 354评论 0 5