import React, { memo, useMemo } from 'react' import { Canvas, Group, Path, Skia } from '@shopify/react-native-skia' import ParallelogramShadow from './ParallelogramShadow' export type ParallelogramShapeProps = { /** 宽度 */ width: number /** 高度 */ height: number /** 填充颜色 */ fillColor?: string /** 描边颜色,默认 #323232 */ strokeColor?: string /** 描边宽度,默认 3 */ strokeWidth?: number /** 内边距,默认 2 */ padding?: number /** 倾斜偏移量,默认 8(统一所有平行四边形的倾斜角度) */ skewOffset?: number /** 是否显示阴影,默认 true */ showShadow?: boolean /** 阴影颜色,默认 #323232 */ shadowColor?: string /** 阴影偏移量,默认 2 */ shadowOffset?: number /** 阴影线粗细,默认 3 */ shadowStrokeWidth?: number /** 平行四边形主体的高度(用于阴影计算),不传则等于 height */ baseHeight?: number /** Canvas 样式 */ canvasStyle?: any /** 子元素(内容,放在 Canvas 外部) */ children?: React.ReactNode /** 在 Canvas 内渲染的自定义内容(Skia 组件) */ renderContent?: () => React.ReactNode } /** * 通用平行四边形形状组件 * * 统一特性: * - 所有平行四边形的倾斜角度一致(skewOffset = 8) * - 所有平行四边形都有右侧阴影和下侧阴影 * - 统一的描边样式(黑色,宽度 3) */ const ParallelogramShape = memo(function ParallelogramShape({ width, height, fillColor = '#FFFFFF', strokeColor = '#323232', strokeWidth = 3, padding = 2, skewOffset = 8, showShadow = true, shadowColor = '#323232', shadowOffset = 2, shadowStrokeWidth = 3, baseHeight, canvasStyle, children, renderContent, }) { // 创建平行四边形路径 const parallelogramPath = useMemo(() => { const path = Skia.Path.Make() path.moveTo(skewOffset + padding, padding) path.lineTo(width - padding, padding) path.lineTo(width - skewOffset - padding, height - padding) path.lineTo(padding, height - padding) path.close() return path }, [width, height, skewOffset, padding]) const skiaFillColor = Skia.Color(fillColor) const skiaStrokeColor = Skia.Color(strokeColor) return ( <> {/* 填充 - 平行四边形主体 */} {/* 描边 - 平行四边形边框 */} {/* 阴影 - 右侧和下侧硬阴影 */} {showShadow && ( )} {/* 自定义内容(在 Canvas 内渲染) */} {renderContent && renderContent()} {/* 内容区域(在 Canvas 外部) */} {children} ) }) ParallelogramShape.displayName = 'ParallelogramShape' export default ParallelogramShape