解决 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)=>{}} />
相关推荐
水云桐程序员1 小时前
学习 React Native(简称 RN)的路径
学习·react native·react.js
水云桐程序员6 小时前
React Native(RN)跨平台 App 架构
react native·objective-c·软件工程·reactnative
沙漠21 小时前
ReactNative总结系列二 --- 小工具&小技巧md
react native
humcomm1 天前
FinClip vs React Native:两大跨平台方案的深度对比
javascript·react native·react.js
水云桐程序员1 天前
Flutter与React Native的对比分析
flutter·react native·react.js
墨狂之逸才3 天前
React Native 状态管理大比拼:Event Bus 还是 Context?小白一看就懂!
react native
爱滑雪的码农3 天前
React Native 完整开发全流程(从零到上线)
javascript·react native·react.js
沐言人生3 天前
ReactNative 源码分析12——Native View创建流程onBatchComplete
android·react native
沐言人生5 天前
ReactNative 源码分析11——Native View创建流程setChildren和manageChildren
android·react native
沐言人生6 天前
ReactNative 源码分析10——Native View创建流程createView
android·react native