時(shí)間:2023-06-23 23:57:02 | 來源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-06-23 23:57:02 來源:網(wǎng)站運(yùn)營(yíng)
手把手教你擼一個(gè)能生成抖音風(fēng)格動(dòng)圖的gif制作平臺(tái):<div className={styles.editorArea}> <div className={styles.formItem}> <span className={styles.label}>文字: </span> <Input value={value['text']} placeholder="請(qǐng)輸入文本內(nèi)容" onChange={(e) => onChange('text', e)} /> </div> <div className={styles.formItem}> <span className={styles.label}>大小: </span> <InputNumber value={value['fontSize']} placeholder="請(qǐng)輸入文本大小" onChange={(e) => onChange('fontSize', e)} /> </div> <div className={styles.formItem}> <span className={styles.label}>文字顏色: </span> <Color value={value['textColor'][0]} onChange={(e) => onChange('textColor', e, 1)} /> <Color value={value['textColor'][1]} onChange={(e) => onChange('textColor', e, 2)} /> </div> <div className={styles.formItem}> <span className={styles.label}>背景色: </span> <Color value={value['themeColor']} onChange={(e) => onChange('themeColor', e)} /> </div> <div className={styles.formItem}> <span className={styles.label}></span> <Button type="primary" onClick={generateGif}>導(dǎo)出Gif</Button> {/* <Button style={{marginLeft: '20px'}} onClick={reset}>重置</Button> */} </div></div>
大家可以不用太關(guān)注代碼細(xì)節(jié), 你可以使用任何熟悉的方式去開發(fā), 表單編輯器主要是實(shí)現(xiàn)和預(yù)覽區(qū)域的互通, 在react里我們用hooks組件的useState來和Blink組件互通, vue的話可以直接用data或者vuex解決問題, 具體如下圖實(shí)現(xiàn): import React, { useRef, useEffect } from 'react'import './index.less'export default function Blink(props) { const { text = '趣談前端', fontSize = '48px', themeColor = '#000', textColor = ['#74fcfd', '#ea3448'], onRef } = props const ref = useRef(null) useEffect(() => { onRef && onRef(ref) }, []) return ( <div className='blink' style={{backgroundColor: themeColor}} ref={ref}> <div className="blink-item" data-text={text} style={{fontSize: fontSize}}> <div className="text text-front" style={{color: textColor[0]}}>{text}</div> <div className="text text-back" style={{color: textColor[1]}}>{text}</div> </div> </div> )}
至于樣式問題, 筆者在github里有詳細(xì)的介紹, 這里就不詳細(xì)說明了. 所以說我們?cè)陧?xiàng)目中實(shí)現(xiàn)預(yù)覽也很簡(jiǎn)單, 直接引入組件即可:<Blink {...value} onRef={(ref) => { blinkRef.current = ref.current}} />
value就是form表單的配置產(chǎn)物.const generateImg = (node, imgId, time) => { return new Promise((resolve, reject) => { setTimeout(() => { domtoimage.toPng(node) .then(function (dataUrl) { let img = new Image(); img.src = dataUrl; img.id = imgId; img.className = 'imgPiece'; document.getElementById('imgBox').appendChild(img); resolve(document.getElementById(imgId)); }) .catch(function (error) { reject(error); }); }, time) }) }
其次我們使用promise.all來將圖片統(tǒng)一收集傳給gif.js對(duì)象:const generateGif = () => { document.getElementById('imgBox').innerHTML = ''; let blink = blinkRef.current; let promiseArr = []; for(let i=0, len=24; i < len; i++) { promiseArr.push(generateImg(blink, `img${i+1}`, 16 * i)); } Promise.all(promiseArr).then(res => { if(res) { let w = res[0].width; let h = res[0].height; // res即為所有的img集合, 可以直接傳給gif.js ... }); } }) }
關(guān)于gif.js的使用方法, 官網(wǎng)里也有詳細(xì)的介紹, 這里筆者不一一舉例了, 感興趣的朋友可以研究一下.saveAs(image, `${uuid(6, 10)}.gif`);
image即是gif.js或者其他動(dòng)圖插件生成的gif圖片, uuid主要是給圖片命名. 大家可以親自在平臺(tái)體驗(yàn): 關(guān)鍵詞:風(fēng)格,平臺(tái),把手
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。