TouchableWithoutFeedback 从不触发触摸事件
TouchableWithoutFeedback never fires touch events
我有以下 React-Native 代码,它会提醒用户它已被按下,但它没有任何响应。
我试过使用不同的 Touchable
组件,但 none 似乎有效,唯一的是 Button
但这不是我真正想要的,我正在构建一个滑块所以按钮不太适合这个。
无论如何,这是我的代码:
import React, {Component} from 'react';
import {View, TouchableWithoutFeedback, Alert, Text} from 'react-native';
import styles from './styles.js';
import LinearGradient from 'react-native-linear-gradient';
export default class BrightnessSlider extends Component {
value: 100;
constructor(...args) {
super(...args);
}
render() {
return (
<LinearGradient start={{x: 0, y: 0}} end={{x: 1, y: 0}} colors={["#222", "#ddd"]} style={styles.brightnessSliderRunnable}>
<View style={styles.brightnessSliderTrack}>
<TouchableWithoutFeedback onPress={() => Alert.alert("Hello World")}>
<View style={styles.brightnessSliderThumb} />
</TouchableWithoutFeedback>
</View>
</LinearGradient>
)
}
}
和./styles.js
import {StyleSheet} from "react-native";
export default styles = StyleSheet.create({
brightnessSliderRunnable: {
top: 50,
height: 9,
width: width - 20,
left: 10,
backgroundColor: "#555",
opacity: 1,
elevation: 1,
borderWidth: 0
// position: "absolute"
},
brightnessSliderThumb: {
width: 23,
height: 23,
borderColor: "#888",
// opacity: 1,
borderWidth: 2,
backgroundColor: "#ffffff",
position: "absolute",
top: -7,
borderRadius: 5,
elevation: 2
},
brightnessSliderTrack: {
width: "100%",
elevation: 1,
borderWidth: 0
}
});
感谢您的帮助
提问者原文code.
解决方案
由提问者的解决方案添加。
更改位置:absolute
到位置:relative
。
如下更改样式表制作的样式类型。
你的原创。
{...styles.colourContainer, opacity: 100 - this.darkness}
推荐方式
[styles.colourContainer, {opacity: 100 - this.darkness}]
我测试了代码,当我们触摸白色方块时它运行良好。
测试于 iOS。
原版App.js.
App.js是我改的。
import React, {Component} from 'react';
import {View, Dimensions, Text} from 'react-native';
import BrightnessSlider from '../components/BrightnessSlider';
import styles from '../components/TempStyle.js';
const d = Dimensions.get('window'),
width = d.width,
height = d.height;
export default class BrightnessSliderTest extends Component {
constructor(...args) {
super(...args);
this.darkness = 0;
this.prevColours = ["#ff0000", "#00ff00", "#0000ff"];
}
render() {
// It is not possible just access the style created by StyleSheet.create(). Do not use StyleSheet.create() or change to flatten the StyleSheet object.
const sty = [styles.colourContainer,{ opacity: 100 - this.darkness}];
return (
<View style={styles.container}>
<View style={sty}>
<View style={styles.toolBar}>
<View style={styles.colourPalette}>
{this.prevColours.map((i, a) => <View key={String(a)} style={[styles.colourTile, {backgroundColor: i}]}/>)}
</View>
{/* <Button title={"Save To Palette"} onTap={this.saveToPalette}>Save</Button> */}
</View>
<BrightnessSlider />
</View>
</View>
);
}
}
为什么?
我不确定如何在其他组件中使用您的组件。但是如果你没有足够大的容器来显示你的组件,触摸区域可能无法工作。这就是为什么我有时在测试中使用 backgroundColor 作为容器。
在测试问题中使用的完整代码后添加。
无法仅通过 StyleSheet.create() 创建的 like 传播运算符访问样式。不要使用 StyleSheet.create() 或更改以展平 StyleSheet 对象。
并且风格可以与平台不同地工作(iOS,Android)。
我有以下 React-Native 代码,它会提醒用户它已被按下,但它没有任何响应。
我试过使用不同的 Touchable
组件,但 none 似乎有效,唯一的是 Button
但这不是我真正想要的,我正在构建一个滑块所以按钮不太适合这个。
无论如何,这是我的代码:
import React, {Component} from 'react';
import {View, TouchableWithoutFeedback, Alert, Text} from 'react-native';
import styles from './styles.js';
import LinearGradient from 'react-native-linear-gradient';
export default class BrightnessSlider extends Component {
value: 100;
constructor(...args) {
super(...args);
}
render() {
return (
<LinearGradient start={{x: 0, y: 0}} end={{x: 1, y: 0}} colors={["#222", "#ddd"]} style={styles.brightnessSliderRunnable}>
<View style={styles.brightnessSliderTrack}>
<TouchableWithoutFeedback onPress={() => Alert.alert("Hello World")}>
<View style={styles.brightnessSliderThumb} />
</TouchableWithoutFeedback>
</View>
</LinearGradient>
)
}
}
和./styles.js
import {StyleSheet} from "react-native";
export default styles = StyleSheet.create({
brightnessSliderRunnable: {
top: 50,
height: 9,
width: width - 20,
left: 10,
backgroundColor: "#555",
opacity: 1,
elevation: 1,
borderWidth: 0
// position: "absolute"
},
brightnessSliderThumb: {
width: 23,
height: 23,
borderColor: "#888",
// opacity: 1,
borderWidth: 2,
backgroundColor: "#ffffff",
position: "absolute",
top: -7,
borderRadius: 5,
elevation: 2
},
brightnessSliderTrack: {
width: "100%",
elevation: 1,
borderWidth: 0
}
});
感谢您的帮助
提问者原文code.
解决方案
由提问者的解决方案添加。
更改位置:absolute
到位置:relative
。
如下更改样式表制作的样式类型。
你的原创。
{...styles.colourContainer, opacity: 100 - this.darkness}
推荐方式
[styles.colourContainer, {opacity: 100 - this.darkness}]
我测试了代码,当我们触摸白色方块时它运行良好。
测试于 iOS。
原版App.js.
App.js是我改的。
import React, {Component} from 'react';
import {View, Dimensions, Text} from 'react-native';
import BrightnessSlider from '../components/BrightnessSlider';
import styles from '../components/TempStyle.js';
const d = Dimensions.get('window'),
width = d.width,
height = d.height;
export default class BrightnessSliderTest extends Component {
constructor(...args) {
super(...args);
this.darkness = 0;
this.prevColours = ["#ff0000", "#00ff00", "#0000ff"];
}
render() {
// It is not possible just access the style created by StyleSheet.create(). Do not use StyleSheet.create() or change to flatten the StyleSheet object.
const sty = [styles.colourContainer,{ opacity: 100 - this.darkness}];
return (
<View style={styles.container}>
<View style={sty}>
<View style={styles.toolBar}>
<View style={styles.colourPalette}>
{this.prevColours.map((i, a) => <View key={String(a)} style={[styles.colourTile, {backgroundColor: i}]}/>)}
</View>
{/* <Button title={"Save To Palette"} onTap={this.saveToPalette}>Save</Button> */}
</View>
<BrightnessSlider />
</View>
</View>
);
}
}
为什么?
我不确定如何在其他组件中使用您的组件。但是如果你没有足够大的容器来显示你的组件,触摸区域可能无法工作。这就是为什么我有时在测试中使用 backgroundColor 作为容器。
在测试问题中使用的完整代码后添加。
无法仅通过 StyleSheet.create() 创建的 like 传播运算符访问样式。不要使用 StyleSheet.create() 或更改以展平 StyleSheet 对象。
并且风格可以与平台不同地工作(iOS,Android)。