要实时刷新画面的话,要使用 requestAnimationFrame 方法,传入一个刷新方法,就会在每帧进行调用刷新。
关于requestAnimationFrame 的介绍:
CSS3动画那么强,requestAnimationFrame还有毛线用? « 张鑫旭-鑫空间-鑫生活
你需要知道的requestAnimationFrame - 掘金
官方的 Ink 代码调整后:
function starPath(CanvasKit: ICanvasKit, X: number, Y: number, R = 128) {const p = new CanvasKit.SkPath();p.moveTo(X + R, Y);for (let i = 1; i < 8; i++) {const a = 2.6927937 * i;p.lineTo(X + R * Math.cos(a), Y + R * Math.sin(a));}return p;}const init = async () => {const CanvasKit = await CanvasKitInit();const dom = document.getElementById('test') as HTMLCanvasElement | null;if (!dom) {console.log('loading...');return;}const surface = CanvasKit.MakeCanvasSurface(dom);const canvas = surface.getCanvas();const paint = new CanvasKit.SkPaint();const textPaint = new CanvasKit.SkPaint();textPaint.setColor(CanvasKit.Color(40, 0, 0, 1.0));textPaint.setAntiAlias(true);const textFont = new CanvasKit.SkFont(null, 30);let offset = 0;let X = 250;let Y = 250;const context = CanvasKit.currentContext();function drawFrame() {// If there are multiple contexts on the screen, we need to make sure// we switch to this one before we draw.CanvasKit.setCurrentContext(context);const path = starPath(CanvasKit, X, Y);// const dpe = CanvasKit.MakeSkDashPathEffect([15, 5, 5, 10], offset / 5);offset++;// paint.setPathEffect(dpe);paint.setStyle(CanvasKit.PaintStyle.Stroke);paint.setStrokeWidth(5.0 + -3 * Math.cos(offset / 30));paint.setAntiAlias(true);paint.setColor(CanvasKit.Color(66, 129, 164, 1.0));canvas.clear(CanvasKit.Color(255, 255, 255, 1.0));canvas.drawPath(path, paint);canvas.drawText('Try Clicking!', 10, 425, textPaint, textFont);canvas.flush();// dpe.delete();path.delete();requestAnimationFrame(drawFrame);}requestAnimationFrame(drawFrame);// Make animation interactivedom.addEventListener('pointermove', e => {if (!e.pressure) {return;}X = e.offsetX;Y = e.offsetY;});};export default (): React.ReactNode => {useEffect(() => {init();}, []);return (<div><canvas id="test" width="1000" height="800" /></div>);};
其实到这一步为止 CanvasKit 的用法基本上已经清楚了,接来下比较重要的应该是做上层封装。
