2016-08-23 53 views
10

我有一个正在消失的标题,我想在屏幕上的任意位置点击一次。但是如果我将整个<View>包装在<TouchableX>组件中,则PanResponder停止工作。这是否有黑客入侵?在整个屏幕上获取触摸事件

+1

一个实现的例子你为什么不只是绑定一个触摸事件添加到文档,窗口或正文,并用适当的函数进行响应? – Mike

+0

@Epik:对于混乱感到抱歉。这是针对反应原生的。 – amit

回答

2

您不需要使用Touchable组件进行变形。

将下一个道具添加到根View

onResponderGrant - 让View手柄触摸

onStartShouldSetResponder - 让View手柄开始

+0

感谢您的优雅解决方案。任何人通过谷歌来到这里,我实现了触摸处理程序,并且还添加了100ms的延迟来检测用户是否真的只想触摸屏幕。 – amit

+1

我很新来回应本地,但如果可能你可以写一个这样的例子吗? – CodeDoctorJL

0

这将是一个onResponderGrant

import React, { Component } from 'react'; 
import { 
    Platform, 
    StyleSheet, 
    Text, 
    View, 
    TouchableOpacity 
} from 'react-native'; 

const instructions = Platform.select({ 
    ios: 'Press Cmd+R to reload,\n' + 
    'Cmd+D or shake for dev menu', 
    android: 'Double tap R on your keyboard to reload,\n' + 
    'Shake or press menu button for dev menu', 
}); 

export default class App extends Component<{}> { 

    constructor() { 
    super(); 
    this.startTouch = this.startTouch.bind(this); 
    this.stopTouch = this.stopTouch.bind(this); 
    this.onTouchE = this.onTouchE.bind(this); 
    } 

    startTouch() { 
    console.debug("You start so don't stop!??"); 
    } 

    stopTouch() { 
    console.debug("Why you stop??"); 
    } 

    onTouchE() { 
    console.debug("Touchable Opacity is working!!"); 
    } 

    render() { 

    return (
     <View style={styles.container} 
      onResponderGrant = {() => this.startTouch() } 
      onResponderRelease = {() => this.stopTouch() } 
      onStartShouldSetResponder = { (e) => {return true} } 
      > 
      <TouchableOpacity 
      onPress = {() => this.onTouchE() } 
      > 
      <Text style={styles.welcome}> 
       Welcome to React Native! 
      </Text> 
      </TouchableOpacity> 
     <Text style={styles.instructions}> 
      To get started, edit App.js 
     </Text> 
     <Text style={styles.instructions}> 
      {instructions} 
     </Text> 
     </View> 
    ); 
    } 
} 

const styles = StyleSheet.create({ 
    container: { 
    flex: 1, 
    justifyContent: 'center', 
    alignItems: 'center', 
    backgroundColor: 'cornflowerblue', 
    }, 
    welcome: { 
    fontSize: 20, 
    textAlign: 'center', 
    margin: 10, 
    }, 
    instructions: { 
    textAlign: 'center', 
    color: '#333333', 
    marginBottom: 5, 
    }, 
});