【React Native开发】React Native控件之Touchable*系列组件详解(18)

转载请标明出处:

http://www.jb51.cc/article/p-tvbdbwbr-bgy.html

本文出自:【江清清的博客】

()前言

【好消息】个人网站已经上线运行,后面博客以及技术干货等精彩文章会同步更新,请大家关注收藏:http://www.lcode.org

今天我们一起来看一下Touchable*系列组件的使用详解,该系列组件包括四种分别为:TouchableHighlight,TouchableNativeFeedback,TouchableOpacity,TouchableWithoutFeedback。其中最后一个控件是触摸点击不带反馈效果的,另外三个都是有反馈效果。可以这样理解前面三个都是继承自TouchableWithoutFeedback扩展而来。

刚创建的React Native技术交流群(282693535),欢迎各位大牛,React Native技术爱好者加入交流!同时博客左侧欢迎微信扫描关注订阅,移动技术干货,精彩文章技术推送!

今天我们需要讲解的这四种控件都是属于Touchable系列的,是封装了触摸点击相关事件,例如:触摸,点击,长按,反馈等相关。下面我们来把这四种组件分别进行讲解一下。

()TouchableWithoutFeedback

2.1.TouchableWithoutFeedback组件基本介绍

该控件除非你不得不使用,否则请不要使用该组件哦~任何可以响应事件的控件当触摸或者点击的时候应该会有视觉上面的反应效果(但是该组件没有)。这就是一个很大的原因,看起来像Web效果而不是原生的效果(Native)

【特别声明】TouchableWithFeedback支持一个字节点,如果你需要设置多个子视图组件,那么就需要使用View节点进行包装。

2.2.属性方法

  • accessibilityComponentType View.AccessibilityComponentType 设置可访问的组件类型
  • accessibilityTraits View.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:number,left:number,bottom:number,right:number} 该设置当视图滚动禁用的情况下,可以定义当手指距离组件的距离。当大于该距离该组价会失去响应。当少于该距离的时候,该组件会重新进行响应。

该组件我们一般不会直接进行使用,下面三种Touchable*系列组件对于该组件的属性方法都可以进行使用。具体会具体演示这些属性方法的使用实例。

()TouchableHighlight(触摸点击高亮效果)

3.1.TouchableHighlight组件基本介绍

该组件进行封装视图触摸点击的属性。当手指点击按下的时候,该视图的不透明度会进行降低同时会看到相应的颜色(视图变暗或者变亮)。如果我们去查看该组件的源代码会发现,该底层实现是添加一个新的视图。如果如果我们没有正确的使用,就可能不会出现正确的效果。例如:我们没有给该组件视图设置backgroudnColor的颜色值。

【特别声明】TouchableHighlight支持一个子节点,如果你需要设置多个子视图组件,那么就需要使用View节点进行包装。

3.2.属性方法

  • TouchableWithoutFeedback 属性,这边TouchableHighlight组件全部可以进行使用
  • activeOpacity number 该用来设置视图在进行触摸的时候,要要显示的不透明度(通常在0-1之间)
  • onHideUnderlay function 方法 当底层被隐藏的时候调用
  • onShowUnderlay function 方法 当底层显示的时候调用
  • style 可以设置控件的风格演示,该风格演示可以参考View组件的style
  • underlayColor 当触摸或者点击控件的时候显示出的颜色

3.3.组件使用实例代码

'use strict';
import React,{
  AppRegistry,Component,StyleSheet,Text,View,TouchableHighlight,} from'react-native';
 
class TouchableHighlightDemo extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text >
          TouchableHighlight实例
        </Text>
        <TouchableHighlight
          underlayColor="rgb(210,230,255)"
          activeOpacity={0.5} 
          style={{ borderRadius: 8,padding:6,marginTop:5}}
          >
             <Text style={{fontSize:16}}>点击我</Text>
        </TouchableHighlight>
      </View>
    );
  }
}
const styles =StyleSheet.create({
  container: {
    flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},});
AppRegistry.registerComponent('TouchableHighlightDemo',() => TouchableHighlightDemo);

3.4.运行效果如下:


()TouchableOpacity(透明度变化)

4.1.TouchableOpacity组件介绍

该组件封装了响应触摸事件。当点击按下的时候,该组件的透明度会降低。该组件使用过程中并不会改变视图的层级关系,而且我们可以非常容易的添加到应用并且不会产生额外的异常错误

4.2.属性方法

  • TouchableWithoutFeedback 属性,这边TouchableOpacity组件全部可以进行使用
  • activeOpacity number 设置当用户触摸的时候,组件的透明度

4.3.组件使用实例代码:

'use strict';
import React,TouchableOpacity,} from'react-native';
 
class TouchableDemo extends Component {
  render() {
    return (
      <View style={styles.container}>
        <Text>
           TouchableOpacity实例
        </Text>
        <TouchableOpacity style={{marginTop:20}}>
           <Text style={{fontSize:16}}>点击改变透明度</Text>
        </TouchableOpacity>
      </View>
    );
  }
}
const styles =StyleSheet.create({
  container: {
    flex: 1,});
 
AppRegistry.registerComponent('TouchableDemo',() => TouchableDemo);

4.4.运行效果截图:


4.5.实例演示onPress,onPressIn,onPressOut,onLongPress方法代码如下:

'use strict';
import React,} from'react-native';
 
var TouchableDemo =React.createClass({
    getinitialState: function() {
    return {
      eventLog: [],};
  },render: function() {
    return (
      <View >
        <View style={[styles.row,{justifyContent: 'center'}]}>
          <TouchableOpacity
            style={styles.wrapper}
            onPress={() =>this._appendEvent('press')}
            onPressIn={() =>this._appendEvent('pressIn')}
            onPressOut={() =>this._appendEvent('pressOut')}
            onLongPress={() =>this._appendEvent('longPress')}>
            <Text style={styles.button}>
              Press Me
            </Text>
          </TouchableOpacity>
        </View>
        <View  style={styles.eventLogBox}>
          {this.state.eventLog.map((e,ii)=> <Text key={ii}>{e}</Text>)}
        </View>
      </View>
    );
  },_appendEvent: function(eventName) {
    var limit = 6;
    var eventLog = this.state.eventLog.slice(0,limit - 1);
    eventLog.unshift(eventName);
    this.setState({eventLog});
  },});
const styles =StyleSheet.create({
  button: {
    color: '#007AFF',wrapper: {
    borderRadius: 8,eventLogBox: {
    padding: 10,margin: 10,height: 120,borderWidth: StyleSheet.hairlinewidth,borderColor: '#f0f0f0',backgroundColor: '#f9f9f9',});
AppRegistry.registerComponent('TouchableDemo',() => TouchableDemo);

4.6.运行效果截图:


()TouchableNativeFeedback

5.1.TouchableNativeFeedback组件介绍

该封装了可以进行响应触摸事件的组件(仅限Android平台)。在Android平台上面该该组件可以使用原生平台的状态资源来显示触摸状态变化。【特别注意】现如今该组件只是支持仅有一个View的子视图实例(作为子节点)。在底层实现上面实际上面是创建一个新的RCTView的节点来进行替换当前的View节点视图,并且可以携带一些附加的属性

该组件触摸反馈的背景图资源可以通过background属性进行自定义设置

下面一个很简单的使用实例方法如下:

var TouchableDemo =React.createClass({
  render() {
    return (
      <View style={styles.container}>
        <Text>
           TouchableNativeFeedback实例
        </Text>
        <TouchableNativeFeedback style={{marginTop:20}}>
            <View style={{width: 150,height: 100,backgroundColor: 'red'}}>
               <Text style={{margin:30}}>Button</Text>
            </View> 
        </TouchableNativeFeedback>
      </View>
    );
  }
});

运行效果如下:


5.2.属性方法介绍

  • TouchableWithoutFeedback 属性,这边TouchableNativeFeedback组件全部可以进行使用
  • background backgroundPropType 该用来设置背景资源的类型,该属性会传入一个type属性和依赖的额外资源的data的对象。官方推荐采用如下的静态方法来进行生成dictionary对象

:TouchableNativeFeedback.SelectableBackground() 该会创建使用android主题背景(?android:attr/selectableItemBackground)

:TouchableNativeFeedback.SelectableBackgroundBorderless() 该会创建使用android认的无框的主题背景(?android:attr/selectableItemBackgroundBorderless)。不过该参数需要Android API 21+才可以使用

:TouchableNativeFeedback.Ripple(color,borderless) 该会创建当组件被按下的时候有一个水滴的效果.通过color参数指定颜色,如果borderless为true的时候,那么该水滴效果会渲染到该组件视图的外边。同样该背景类型参数也需要Android API 21+才可以使用

5.3.使用实例代码:

:先设置backgroundPropType认的背景效果代码:

var TouchableDemo =React.createClass({
  render() {
    return (
      <View style={styles.container}>
        <Text>
           TouchableNativeFeedback实例
        </Text>
        <TouchableNativeFeedback style={{marginTop:20}}
           background={TouchableNativeFeedback.SelectableBackground()}>
            <View style={{width: 150,}}>
               <Text style={{margin:30}}>Button</Text>
            </View> 
        </TouchableNativeFeedback>
      </View>
    );
  }
});

效果如下:


()最后总结

今天我们主要学习一下Touchable*系列组件的使用详解,该系列组件包括四种分别为:TouchableHighlight,TouchableWithoutFeedback。大家有问题可以加一下群React Native技术交流群(282693535)或者底下进行回复一下。

尊重原创,转载请注明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵权必究!

关注我的订阅号(codedev123),每天分享移动开发技术(Android/IOS),项目管理以及博客文章!(欢迎关注,第一时间推送精彩文章)

关注我的微博,可以获得更多精彩内容

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom