解决 RN Switch 组件在安卓端样式很丑的问题

解决此种问题的方式有很多

  • 可以导入原生库react-native-switch

  • 切图 (会缺少动画)

  • 使用 js 组件

这里使用 js 绘制组件(原生体验)解决此类问题

Switch.tsx

tsx 复制代码
import React, { useEffect, useRef, useState } from 'react';
import { Animated, Pressable, StyleSheet } from 'react-native';

interface SwitchProps {
  value?: boolean;
  onChange?: (value: boolean) => void;
}

const Switch: React.FC<SwitchProps> = ({ value = false, onChange }) => {
  const switchAnim = useRef(new Animated.Value(0)).current;
  const switchHandle = () => {
    onChange?.(!value);
  };

  useEffect(() => {
    const toValue = value ? 23 : 3;
    Animated.timing(switchAnim, {
      toValue,
      duration: 100,
      useNativeDriver: false, // 此处原生驱动会导致 ios 颜色显示不对
    }).start();
  }, [switchAnim, value]);

  const backgroundColor = switchAnim.interpolate({
    inputRange: [0, 25],
    outputRange: ['#D2D2D2', '#904FF5'],
  });

  return (
    <Pressable onPress={switchHandle}>
      <Animated.View style={[styles.radioContainer, { backgroundColor }]}>
        <Animated.View style={[styles.radio, { transform: [{ translateX: switchAnim }] }]} />
      </Animated.View>
    </Pressable>
  );
};

const styles = StyleSheet.create({
  radioContainer: {
    width: 52,
    height: 32,
    borderRadius: 17,
    justifyContent: 'center',
    marginRight: 5,
  },
  radio: {
    width: 25,
    height: 25,
    backgroundColor: '#FFFFFF',
    borderRadius: 15,
  },
});

export default (props: SwitchProps) => {
  const [value, setValue] = useState(props.value || false);

  // 监听 props.value 的变化并更新内部状态
  useEffect(() => {
    setValue(props.value ?? false);
  }, [props.value]);

  return (
    <Switch
      value={value}
      onChange={() => {
        props.onChange?.(!value);
      }}
    />
  );
};

用法

tsx 复制代码
<Switch value={value} onChange={(value: boolean)=>{}} />
相关推荐
wen's1 天前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js
朝阳392 天前
ReactNative【实战系列教程】我的小红书 3 -- 自定义底栏Tab导航(含图片选择 expo-image-picker 的使用)
react native
冰冷的bin2 天前
【React Native】自定义倒计时组件CountdownView
react native
朝阳3912 天前
React Native【实用教程】(含图标方案,常用第三库,动画,内置组件,内置Hooks,内置API,自定义组件,创建项目等)
react native
朝阳3912 天前
React Native【实战范例】同步跟随滚动
react native
朝阳3914 天前
React Native【详解】动画
react native
朝阳3915 天前
React Native【详解】内置 API
react native
xx240615 天前
React Native学习笔记
笔记·学习·react native
朝阳3915 天前
React Native【实战范例】弹跳动画菜单导航
react native
草明15 天前
解决: React Native iOS webview 空白页
react native·react.js·ios