解决 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)=>{}} />
相关推荐
Live000002 天前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
lbb 小魔仙7 天前
鸿蒙跨平台项目实战篇03:React Native Bundle增量更新详解
react native·react.js·harmonyos
2301_796512527 天前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:点击组件(跳转快应用)
javascript·react native·react.js·ecmascript·harmonyos
2301_796512527 天前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Sidebar 侧边导航(绑定当前选中项的索引)
javascript·react native·react.js·ecmascript·harmonyos
lbb 小魔仙7 天前
鸿蒙跨平台项目实战篇01:React Native Bundle版本管理详解
react native·react.js·harmonyos
2301_796512527 天前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Pagination 分页(绑定当前页码)
javascript·react native·react.js·ecmascript·harmonyos
星空22237 天前
鸿蒙跨平台实战:React Native 在 OpenHarmony 上的 PixelFormat 图片格式处理
react native·华为·harmonyos
getyefang7 天前
react-native使用字体库如何在安卓显示
javascript·react native·react.js
星空22238 天前
鸿蒙跨平台实战day47:React Native在OpenHarmony上的Font自定义字体注册详解
react native·华为·harmonyos