跨端接口使用
本章节并不是开发中必须的,如果你的应用需要再不同环境中运行(nodejs,浏览器,小程序)。又不想自己去写兼容,比如获取dpr(devicePixelRatio),创建Canvas,或者想用一些工具函数,就可以阅读本章节。
VRender提供了一系列默认的接口,用于屏蔽跨端的影响,目前会支持Browser、Node、feishu、tt等环境,其余环境可以通过扩展支持。
Global
Global是一个静态类,提供了全局的跨端API,用户可以直接拿Global当浏览器的window用,Global会自动提供跨平台的兼容
Global需要手动设置env,不需要自行添加跨端方法 注意:node端使用node-canvas,Canopus不会自动引用,需要用户手动将node-canvas包传入
type IEnv = 'feishu' | 'tt' | 'browser' | 'node';
interface IDocument {
createElement(t: 'canvas'): HTMLCanvasElement;
createElement(t: string): HTMLElement;
}
export interface IGlobal {
readonly env: IEnv;
// 如果是nodejs环境,那么必传params
setEnv: (env: IEnv, params: { canvasPkg?: { canvas: any; loadImage: any } }) => void;
createCanvas: () => ICanvas;
releaseCanvas: (canvas: ICanvas) => void;
getImageData: (ctx?: IContext2d) => ImageData;
// 加载图片
loadImage: (url: string, type: 'Image' | 'ImageData') => HTMLImageElement | Image | ImageData;
// RAF
requestAnimationFrame: IRequestAnimationFrame;
// 获取dpr
devicePixelRatio: number;
document: IDocument;
}
GraphicUtil
与Global不同的是,GraphicUtil提供的是跨端方面以及图形方面的API,其中包括Transform API,MeasureText API
Transform模块是方便用户手动进行变换,基于一个已有的变换配置,变换到另一个空间
interface IGraphicUtil {
canvas?: ICanvas;
context?: IContext2d | null;
textMeasure: ITextMeasure;
measureText: (text: string, tc: TextOptionsType) => { width: number; height: number };
bindTextMeasure: (tm: ITextMeasure) => void;
createTextMeasureInstance: (
textSpec?: Partial<ITextAttribute>,
option?: Partial<ITextMeasureOption>,
getCanvasForMeasure?: () => any
) => TextMeasure<ITextAttribute>;
drawGraphicToCanvas: (
graphic: IGraphic,
stage: IStage
) => HTMLCanvasElement | null | Promise<HTMLCanvasElement | null>;
}
interface TransformType {
x: number, y: number,
scaleX: number, scaleY: number,
// shearMatrix是剪切变换的矩阵(如果存在剪切变换的话)
angle: number, shearMatrix?: Matrix
}
interface Transform {
// 提供初始的变换配置
init: (origin: TransformType) => Transform;
translate: (x: number, y: number) => Transform;
translateTo: (x: number, y: number) => Transform;
scale: (sx: number, sy: number, center: IPoint) => Transform;
scaleTo: (sx: number, sy: number, center: IPoint) => Transform;
rotate: (angle: number, center: IPoint) => Transform;
rotateTo: (angle: number, center: IPoint) => Transform;
// 语法糖,交互的时候可用,每次传入这次的变化数据
interactive: (dx: number, dy: number, dsx: number, dsy: number, drx: number, dry: number) => Transform;
// 扩展padding像素,用于外描边,内描边
extend: (origin: TransformType, padding: number) => Transform;
// 将所有的transform生成为一次的transform
simplify: (target?: TransformType) => TransformType;
}