【问题标题】:How to draw rounded corner rectangle in React Native ART如何在 React Native ART 中绘制圆角矩形
【发布时间】:2019-06-28 11:08:21
【问题描述】:

我正在使用react-native ART 库在我的移动应用程序中绘制可缩放的矢量元素,ART 是完美的库,因为它可以使用自己的工具轻松进行动画和变形。但是ART 没有像 SVG 的 CircleRect etch... 这样的自定义元素,ART 只有一种称为 Shape 的类型,并且功能强大,几乎可以创建任何形状。但是我在使用Shape 绘制可缩放的圆角矩形时遇到了困难。

import React from 'react'
import PropTypes from 'prop-types'
import {ART} from 'react-native'

const {Group, Shape} = ART

export default class Graphics extends React.Component{
   render(){
      const {x, y, width, height, fill, stroke} = this.props;
      const d = `M0,0L${width},0L${width},${height}L0,${height}L0,0z`
      return(
        <Group x={x} y={y}>
           <Path d={d} fill={fill} stroke={stroke}>
        </Group>
      )
   }
}

如您所见,我创建了具有给定宽度和高度的矩形形状,但我不知道如何生成圆角。

我不知道 d3 是否可以使用任何一个 d3 来做到这一点?

【问题讨论】:

    标签: javascript reactjs react-native d3.js svg


    【解决方案1】:

    您可以使用ART Path 对象与curvecurveTo 方法或arc arcTo 方法一起创建路径。请检查下面的示例Rect 组件。

    import React from 'react'
    import PropTypes from 'prop-types'
    import {ART} from 'react-native'
    const {Group, Shape, Path} = ART
    
    function Rect({fill, stroke, x, width, y, rc, height, topLeftRadius, topRightRadius, bottomRightRadius, bottomLeftRadius, ...rest}){
        const startX = 0;
        const startY = 0;
        const smallDimension = width > height ? height : width;
        let tlr = topLeftRadius !== null ? topLeftRadius : rc; tlr =  tlr > smallDimension/2 ? smallDimension /2 : tlr;
        let trr = topRightRadius !== null ? topRightRadius : rc; trr = trr > smallDimension/2 ? smallDimension /2 : trr;
        let brr = bottomRightRadius !== null ? bottomRightRadius : rc; brr = brr > smallDimension/2 ? smallDimension /2 : brr;
        let blr = bottomLeftRadius !== null ? bottomLeftRadius : rc; blr = blr > smallDimension/2 ? smallDimension /2 : blr;
        const d = Path()
                    .move(startX, startY)
                    .move(startX, tlr)
                    .arc( tlr, startY-tlr, tlr, tlr, false, false) // top left
                    .lineTo(width - trr, startY)
                    .arc( trr, startX+trr, trr, trr, false, false) // top right
                    .lineTo(width, startY+ (height - brr))
                    .arc(startX-brr, brr, brr, brr, false, false) // bottom right
                    .lineTo(startX + blr, height)
                    .arc(startX-blr, startY-blr, blr, blr, false, false) // bottom right
                    .close()
    
        return(
            <Group x={x} y={y}>
                <Shape {...rest} fill={fill} stroke={stroke} d={d}/>
            </Group>
        )
    }
    
    Rect.propTypes = {
        width: PropTypes.number.isRequired,
        height: PropTypes.number.isRequired,
        x: PropTypes.number,
        y: PropTypes.number,
        fill: PropTypes.string,
        stroke: PropTypes.string,
        topLeftRadius: PropTypes.number,
        topRightRadius: PropTypes.number,
        bottomRightRadius: PropTypes.number,
        bottomLeftRadius: PropTypes.number,
        rc: PropTypes.number
    }
    
    Rect.defaultProps = {
        x: 0,
        y: 0,
        fill: 'transparent',
        stroke: 'red',
        topLeftRadius: null,
        topRightRadius: null,
        bottomRightRadius: null,
        bottomLeftRadius: null,
        rc: 0
    }
    
    export default Rect
    

    这里你有完全可扩展的独立圆角支持矩形组件。

    • 道具width & height - 将正常矩形完全没有圆角。
    • 道具widthheightrc - 将为您提供同等的圆角。
    • 道具widthheighttopRightRadius(或任何其他角) - 将为您提供每个给定的圆角。

    请查看此gist 了解完整用法。

    【讨论】: