微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

React-Native:如何绘制具有随机边数的形状边数将是用户输入的值?

如何解决React-Native:如何绘制具有随机边数的形状边数将是用户输入的值?

如果用户输入数字 4 ,则生成的形状将变为正方形。如果用户输入 9 ,则该形状将变为非三角形。 这应该是一个反应性的解决方案:) 有什么想法吗?

解决方法

代码应该是不言自明的。您可以在圆上找到这些点,然后借助svg多边形将它们与直线连接起来。

Snack

import React,{ useState,useEffect } from 'react';
import { View,StyleSheet,Dimensions,Text,TextInput } from 'react-native';
import Svg,{ Polygon } from 'react-native-svg';
import Constants from 'expo-constants';

export default function App() {
  const windowWidth = Dimensions.get('window').width;
  const Center = windowWidth / 2;
  const Radius = Center - 20;

  const [numSides,setNumSides] = useState(3);
  const [polygonPoints,setPolygonPoints] = useState();

  useEffect(() => {
    let newPolyPoints = '';
    const angle = 2 * Math.PI / numSides;
    for (let side = 0; side < numSides; side++) {
      const x = Math.cos(angle * side) * Radius + Center;
      const y = Math.sin(angle * side) * Radius + Center;
      newPolyPoints = `${newPolyPoints} ${x},${y}`;
    }
    setPolygonPoints(newPolyPoints);
  },[numSides]);

  const inputIsValid = t => {
    const int = parseInt(t,10);
    return isNaN(int) === false && int >= 3;
  }

  return (
    <View style={styles.container}>
      <View style={styles.inputContainer}>
        <Text style={styles.label}>
          {'Number of sides: '}
        </Text>
        <TextInput
          style={styles.textInput}
          defaultValue={numSides.toString()}
          selectTextOnFocus
          onChangeText={t => {
            if (inputIsValid(t)) {
              const int = parseInt(t,10);
              setNumSides(int);
            }
          }}
        />
      </View>
      <Svg style={styles.svg} width={windowWidth} height={windowWidth}>
        <Polygon
          points={polygonPoints}
          fill="lime"
          stroke="purple"
          strokeWidth="1"
        />
      </Svg>
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,justifyContent: 'center',paddingTop: Constants.statusBarHeight,backgroundColor: '#ecf0f1',padding: 8,},inputContainer: {
    flexDirection: 'row',alignItems: 'center',marginVertical: 20,marginHorizontal: 12,label: {
    fontSize: 18,textInput: {
    backgroundColor: 'white',flex: 1,fontSize: 18,svg: {
    aspectRatio: 1,backgroundColor: 'tomato',});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。