【REACT NATIVE 系列教程之一】触摸事件的两种形式与四种TOUCHABLE组件详解

本站文章均为李华明Himi原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文链接:http://www.himigame.com/react-native/2203.html


本文是RN(React Native)系列教程第一篇,当然也要给自己的群做个广告:

React Native @Himi :126100395 刚创建的群,欢迎一起学习、讨论、进步。

本文主要讲解两点:

1. PanResponder:触摸事件,用以获取用户手指所在屏幕的坐标(x,y)或触发、或滑动、或抬起几种事件通知。

2. Touchable:React为我们封装好的触摸组件。引用原文:“响应系统用起来可能比较复杂。所以我们提供了一个抽象的Touchable实现,用来做“可触控”的组件。这一实现利用了响应系统,使得你可以简单地以声明的方式来配置触控处理。”

一:触摸事件各事件响应与坐标获取

1. 在import React 中添加要使用的触摸组件:

importReact,{
...
PanResponder,//触摸必要的组件
...
}from'react-native';

2. 声明:

constructor(props){
super(props);
this.state={
eventName:'',pos:'',};
this.myPanResponder={}
}


这里先声明了两个变量posX,posY用于显示坐标用,另外声明了一个myPanResponder 用于后面的触摸事件。

3. 创建、设置与响应

componentWillMount(){
this.myPanResponder=PanResponder.create({
//要求成为响应者:
onStartShouldSetPanResponder:(evt,gestureState)=>true,onStartShouldSetPanResponderCapture:(evt,onMoveShouldSetPanResponder:(evt,onMoveShouldSetPanResponderCapture:(evt,onPanResponderTerminationRequest:(evt,//响应对应事件后的处理:
onPanResponderGrant:(evt,gestureState)=>{
this.state.eventName='触摸开始';
this.forceUpdate();
},onPanResponderMove:(evt,gestureState)=>{
var_pos='x:'+gestureState.moveX+',y:'+gestureState.moveY;
this.setState({eventName:'移动',pos:_pos});
},onPanResponderRelease:(evt,gestureState)=>{
this.setState({eventName:'抬手'});
},onPanResponderTerminate:(evt,gestureState)=>{
this.setState({eventName:'另一个组件已经成为了新的响应者'})
},});
}


以上代码分为3部分,先创建,然后对需要追踪的事件进行设置响应,最后重写响应的事件进行处理即可。

需要注意的:绑定到componentDidMount的话可能会失效,需要在componentWillMount处预先创建手势响应器

4. 为要响应的View进行设置


1

{..thismyPanResponderpanHandlers}

5. 完善Render函数:

render(){
return(
<Viewstyle={styles.himiViewStyle}
{...this.myPanResponder.panHandlers}
>
<Textstyle={styles.himiTextStyle}>HimiReactNative教程</Text>
<Viewstyle={styles.container}>
<Textstyle={styles.text}>{this.state.eventName}</Text>
<Textstyle={styles.text}>{this.state.pos}</Text>
</View>
</View>

)}


6.用到的布局和样式:

varstyles=StyleSheet.create({
container:{
flex:1,flexDirection:'row',justifyContent:'center',alignItems:'center',backgroundColor:'#F5FCFF',},text:{
color:'#f00',fontSize:30,himiViewStyle:{
flex:1,flexDirection:'column',himiTextStyle:{
color:'#f00',marginTop:70,});


效果如下:(点击查看动态效果)

user

如上是第一种形式,下面我们简单说下如何使用第二种形式:

componentWillMount(){

this.myPanResponder=PanResponder.create({

//*********************第二种触摸的形式***************************
//类似shouldComponentUpdate,监听手势开始按下的事件,返回一个boolean决定是否启用当前手势响应器
onStartShouldSetPanResponder:this._handleStartShouldSetPanResponder.bind(this),//监听手势移动的事件,返回一个boolean决定是否启用当前手势响应器
onMoveShouldSetPanResponder:this._handleMoveShouldSetPanResponder.bind(this),//手势开始处理
onPanResponderGrant:this._handlePanResponderGrant.bind(this),//手势移动时的处理
onPanResponderMove:this._handlePanResponderMove.bind(this),//用户放开所有触点时的处理
onPanResponderRelease:this._handlePanResponderRelease.bind(this),//另一个组件成了手势响应器时(当前组件手势结束)的处理
onPanResponderTerminate:this._handlePanResponderEnd.bind(this)

});
}

_handleStartShouldSetPanResponder(e,gestureState){
//返回一个boolean决定是否启用当前手势响应器
returntrue;
}
_handleMoveShouldSetPanResponder(e,gestureState){
returntrue;
}
_handlePanResponderGrant(e,gestureState){
this.setState({
eventName:'Start'
})
}
_handlePanResponderRelease(e,gestureState){
this.setState({
eventName:'End'
})
}
_handlePanResponderMove(e,gestureState){
var_pos='x:'+gestureState.moveX+',y:'+gestureState.moveY;
this.setState({
eventName:'Move:',pos:_pos
})
}
_handlePanResponderEnd(e,gestureState){
this.setState({
eventName:'另一个组件成了手势响应器时(当前组件触摸结束)的处理'
})
}


第二种形式就是将触摸响应绑定到我们自定义的函数,其他没有基本没区别。改动只有两点:

1. 绑定时修改成将触摸事件的回调绑定到我们自定义函数。

2. 添加每个响应的自定义函数。

效果如下:(点击查看动态效果)

user2

二:四种 Touchable 触摸组件

Touchable 一共有四种形式:

TouchableHighlight: 当按下的时候,封装的视图的不透明度会降低,同时会有一个底层的颜色透过而被用户看到,使得视图变暗或变亮。

TouchableNativeFeedback:(仅限Android平台)在Android设备上,这个组件利用原生状态来渲染触摸的反馈。

TouchableOpacity: 当按下的时候,封装的视图的不透明度会降低。这个过程并不会真正改变视图层级,大部分情况下很容易添加到应用中而不会带来一些奇怪的副作用。

TouchableWithoutFeedback: 除非你有一个很好的理由,否则不要用这个组件。所有能够响应触屏操作的元素在触屏后都应该有一个视觉上的反馈(然而本组件没有任何视觉反馈),仍会触发触摸事件的响应

1. 添加Touchable的四种组件

importReact,{
...
Image,Alert,TouchableHighlight,TouchableNativeFeedback,TouchableOpacity,TouchableWithoutFeedback,...
}from'react-native';



Himi这里还添加了Image和Alert两个组件:

Image 是图片组件,这里是为了测试效果,将Touchable发生在图片

Alert 弹窗提示组件,是为了通过弹窗,更好的展示出事件响应效果

2. 在Render添加如下:


<Viewstyle={styles.container}>
<TouchableHighlight
underlayColor='#4169e1'
onPress={this.test}
>
<Image
source={require('./res/himi.png')}
style={{width:70,height:70}}
/>
</TouchableHighlight>

<TouchableOpacity
activeOpacity={0.5}
onPress={()=>{Alert.alert('Himi','TouchableOpacity');}}
>
<Image
source={require('./res/himi.png')}
style={{width:70,height:70}}
/>
</TouchableOpacity>

<TouchableWithoutFeedback
underlayColor='#4169e1'
activeOpacity={0.5}
onPress={()=>{Alert.alert('Himi','TouchableWithoutFeedback');}}
>
<Image
source={require('./res/himi.png')}
style={{width:70,height:70}}
/>
</TouchableWithoutFeedback>
</View>



由于Himi写博客时在Mac下,那么如下我们来创建除仅限Android的TouchableNativeFeedback之外的三种形式。

根据反馈的形式,大家可以自行设置其透明度、背景色、样式等。

效果图如下:(点击查看动态图)

user4

注意:Touchable 组件系列都只能包含一个子组件,也就是说你想多个,可以嵌套View组件来实现。如:

<TouchableHighlight>
<View>
<Text>t1</Text>
<Text>t2</Text>
</View>
</TouchableHighlight>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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