我正在尝试构建一个带有动画按钮的ReactNative应用程序。问题是在应用程序第一次启动后,这个动画不能正常工作。有一些白色 Flink 。但在动画第一次运行错误后,一切都按预期工作:
我已经尝试过几种方式来预加载图像,但没有任何成功。
这是我的最小工作示例,请注意,如果有几个不同的图像,则在加载新图像时会发生 Flink (例如,我有两个蓝色按钮,在我点击第一个按钮后,第二个按钮将正常工作,但如果我点击橙子按钮,它将再次第一次 Flink ,至少如果我在应用程序启动后没有点击另一个橙色按钮。):
import React, { Component } from 'react';
import {StyleSheet, Text, TouchableWithoutFeedback, View, Image, ScrollView,
Button, BackHandler} from 'react-native';
export default class Touchables extends Component {
constructor(props) {
super(props);
this.state = {alarm1: (<Image source={require("./assets/alarmoff.png")}
style={styles.imageButton}/>),
}
}
componentWillMount(){
//trying to preload all Images, but it does not help.
(<Image source={require("./assets/alarmon.png")} style=
{styles.imageButton}/>)
}
render() {
return (
<ScrollView style={styles.contentContainer}>
<View style={{flex: 3, flexDirection: 'row'}}>
<View style={styles.container}>
<TouchableWithoutFeedback onPressIn={() => this.setState({alarm1:
<Image source={require("./assets/alarmon.png")} style={styles.imageButton}/>})} onPressOut={() => this.setState({alarm1: <Image source={require("./assets/alarmoff.png")} style={styles.imageButton}/>})}>
<View style={styles.button}>
{this.state.alarm1}
</View>
</TouchableWithoutFeedback>
<Text style={styles.text}>This button flickers on first click. Restart App completly to see the issue. Reloading is not enough.</Text>
</View>
</View>
<View>
<Button
onPress={() => BackHandler.exitApp()}
title="Exit App"
color="#841584"
accessibilityLabel="Android only I guess."
/>
</View>
</ScrollView>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 2,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
marginBottom: 30
},
button: {
backgroundColor: '#fff',
borderRadius: 20,
padding: 10,
marginBottom: 20,
shadowColor: '#303838',
shadowOffset: { width: 0, height: 5 },
shadowRadius: 10,
shadowOpacity: 0
},
contentContainer: {
paddingVertical: 20,
flex: 1,
backgroundColor: '#fff',
},
text:{
color: '#000',
marginBottom: 30
},
imageButton: {
flex: 1,
width: 240,
height: 200,
marginBottom: -15,
marginTop: 10,
resizeMode: 'cover'
}
});
所以我的问题是,如何在应用程序启动后阻止图像 Flink ?
我构建的小演示应用程序的完整版本可以在我的Github Repository上找到
6条答案
按热度按时间lf3rwulv1#
加载不同分辨率的图像时可能会出现性能问题。您可以使用https://github.com/DylanVann/react-native-fast-image模块加载图像。
你可以添加和链接它如下
之后,你可以导入它,并使用它使用像下面的例子
我复制了这个例子,从该repo。你可以找到文档也有。尝试一下。这将提高图像加载性能。然后最有可能 Flink 的问题将得到解决。
hgqdbh6s2#
对我来说,当我把图像组件放在一个平面列表列表头组件中时,它会导致 Flink 问题。
ListHeaderComponent={HeadComponent}
HeadComponent基本上位于
render
中,代码为const HeadComponent = () => { return (<Image...
ListHeaderComponent={this.renderHeader}
renderHeader
是一个使用代码renderHeader () { return (<Image...
返回与HeadComponent
相同内容的函数希望这能帮到什么人。
vojdkbi03#
当我将图像组件放在平面列表ListHeaderComponent组件中时,它会导致 Flink 问题
为了解决这个问题,我添加了useCallBack钩子
对我来说,它解决了 Flink 的问题
nhaq1z214#
我有一个变通方法(有点..)。在我的
componentDidMount()
中,我现在将按钮设置为按下状态,等待一段时间,直到图像显示并缩放,然后我再次将状态设置为关闭,如下所示:我试图将超时时间降低到不到一秒钟,但后来在我的旧(而且很慢)手机上,应用程序加载后第一次按下时又开始 Flink 。
这显然会导致应用程序加载后按钮状态发生变化,但如果所有按钮在应用程序启动后 Flink 一次,在我看来,这比第一次按下时每个按钮 Flink 要好。
然而,如果有人能告诉我真实的的方法,如何解决这个问题,我会很高兴。
aamkag615#
对于任何仍然有这个问题的人:这是另一种修复
u4dcyp6a6#
如果您使用expo,则可以使用
Asset.loadAsync
。请参见:https://docs.expo.io/versions/latest/sdk/asset.在
App.js
中,我喜欢在显示任何屏幕之前等待加载所有静态资产。