如何在渲染前四舍五入按钮?

时间:2019-03-16 18:16:37

标签: react-native

我想创建一个按钮组件,无论其尺寸如何,该组件都会自动具有圆角。

如您所知,要获得圆角,一种实现方法是将边框半径指定为按钮高度的一半。

我实现的方式是在自定义组件中使用onLayout函数,如下所示:

 onLayout(event: LayoutChangeEvent) {
    const { height } = event.nativeEvent.layout;
    this.setState({ borderRadius: height / 2 });
  }

问题在于该按钮最初将在屏幕上显示为矩形,并且仅在毫秒后才会在拐角处变圆,从而导致闪烁。

我的猜测是onLayout在组件渲染之后被调用。

如何实现这一目标?谢谢!

3 个答案:

答案 0 :(得分:0)

在计算borderRadius之前,您可以返回透明按钮,这样可以防止这种闪烁效果...

// you pass radius, and height from component state

const MyButton = ({ radius, height }) => {
   if (radius === null) return <View style={{ backgroundColor: transparent }}>...</View>

else return <View style={{ borderRadius: radius, backgroundColor: 'red' }}>...</View>;
};

答案 1 :(得分:0)

要精确地执行此操作,您需要知道字符串 呈现后将占用的大小。我无法为此找到React Native API(并且我假设您也找不到),但是我知道Android和iOS都具有此类API。因此,解决方案将是在iOS和Android中创建一个本机模块(https://facebook.github.io/react-native/docs/native-modules-android.html),该模块公开一种称为“ measureText”的方法。然后,在每个本机类中,您将使用相应的API:

我实际上还没有尝试过,所以我很好奇这样的事情最终能否奏效。干杯!

答案 2 :(得分:0)

您可以使用生命周期方法componentWillMount()计算边界半径:

componentWillMount() {
    const { height } = Dimensions.get('window');
    radius = height / 2;
}
  

此方法仅被调用一次,即在初始调用之前   渲染。由于此方法是在render()之前调用的。

然后,您可以使用计算出的半径来设置按钮样式:

<TouchableOpacity
    style={[styles.button, { borderRadius: radius }]}
    onPress={() => alert('Hello World!') }
>

这里是工作中的demo