| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | import React from 'react';import { Animation, interpolate } from '@douyinfe/semi-animation-react';const styles = {    container: {        height: '100%',        display: 'flex',        justifyContent: 'center',        alignItems: 'center',        willChange: 'background',    },    shape: { width: 300, height: 300, willChange: 'transform' },};export default class SimpleAnimation extends React.Component {    state = { toggle: true };    toggle = () => {        this.setState(state => ({ toggle: !state.toggle }));        if (this.handler && this.handler.reverse) {            this.handler.reverse();            this.handler.start();        }    };    render() {        const shapeFrom = [20, 380, 380, 380, 380, 380, 200, 20, 20, 380];        const shapeTo = [20, 20, 20, 380, 380, 380, 380, 20, 20, 20];        const prefixes = ['M', ',', ' L', ',', ' L', ',', ' L', ',', ' L', ','];        return (            <Animation                from={{ value: 0 }}                to={{ value: 50 }}                forwardInstance={handler => (this.handler = handler)}                onRest={() => {                    if (this.handler) {                        this.handler.reverse();                        this.handler.start();                    }                }}                // to={{                //     coords: toggle ? [0, 0] : [50, 50],                //     color: toggle ? '#247BA0' : '#70C1B3',                //     start: toggle ? '#B2DBBF' : '#B2DBBF',                //     end: toggle ? '#247BA0' : '#F3FFBD',                //     scale: toggle ? 0.3 : 0.4,                //     shape: toggle ? TRIANGLE : RECTANGLE,                //     stop: toggle ? '0%' : '50%',                //     rotation: toggle ? '0deg' : '45deg',                // }}            >                {({ value }) => {                    const ratio = value / 50;                    // hsl(48, 16%, 57%) => hsl(71, 100%, 87%)                    const start = `hsl(${(71 - 48) * ratio + 48}, ${(100 - 16) * ratio + 16}%, ${(87 - 57) * ratio +                        57}%)`;                    const stop = `${value}%`;                    const end = `hsl(${value * 5 + 50}, 90%, 60%)`;                    // hsl(170, 40%, 60%) => hsl(198, 63%, 38%)                    // const color = `hsl(${value * 6 + 40}, 90%, 60%)`;                    const color = `hsl(${(198 - 170) * ratio + 170}, ${(63 - 40) * ratio + 40}%, ${(38 - 60) * ratio +                        60}%)`;                    const scale = 0.1 * ratio + 0.3;                    const rotation = 45 * ratio + 'deg';                    const coords = [value, value];                    const shape = interpolate(shapeFrom, shapeTo, ratio)                        .map((v, idx) => '' + (prefixes[idx] || '') + v)                        .join('') + ' Z';                    return (                        <div                            style={{                                ...styles.container,                                // background: `linear-gradient(to bottom, ${start} ${stop}, ${end} 100%)`,                                background: `${start}`,                            }}                        >                            <svg                                style={{                                    ...styles.shape,                                    transform: `scale3d(${scale}, ${scale}, ${scale}) rotate(${rotation}) translate3d(${                                        coords[0]                                    }px,${coords[1]}px,0)`,                                }}                                version="1.1"                                viewBox="0 0 400 400"                            >                                <g style={{ cursor: 'pointer' }} fill={color} fillRule="evenodd" onClick={this.toggle}>                                    <path id="path-1" d={shape} />                                </g>                            </svg>                        </div>                    );                }}            </Animation>        );    }}
 |