2016-08-23 91 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, 
    }, 
});