ICanvas - Library
ts
import { ICanvas } from '@/uni_modules/tmx-ui/core/canvas/ICanvas.uts';
export type ShapeType = any;
/** 旋转元素时的中心点,默认是topLeft左顶,center表示元素的中间 */
export type ITextAlignType = 'left' | 'center' | 'right';
export type ITextBaselineType = 'top' | 'middle' | 'bottom';
export type ILineJoinType = "round" | "bevel" | "miter";
export type ILineCapType = "butt" | "round" | "square";
export type CanvasRotateCenter = "topLeft"|"center"|"topRight"|"bottomLeft"|"bottomRight"
export type DirectionEventType = 'down' | 'move' | 'up';
export type InteractionEventType = 'click' | 'longpress' | 'dbclick' | 'cancel';
export type CanvasEventType = DirectionEventType | InteractionEventType;
export type ShapeSetAttrType = string | number | boolean | Array<string>
export type IShapeVector2d = {
x:number,
y:number
}
export type ICanvasEvent = {
type: CanvasEventType;
/** 在画布上的坐标X */
x: number;
/** 在画布上的坐标Y */
y: number;
detail:IcanvasDomEventDetail[],
touches:ICanvasEvent[];
target: ShapeType[];
}
export type IcanvasDomEventDetail = {
startX:number,
startY:number,
endX:number,
endY:number,
moveX:number,
moveY:number,
/** 相对上一次移动的距离*/
moveLenX:number,
/** 相对上一次移动的距离*/
moveLenY:number,
/** 相对起始时到当前位置移动的距离*/
endLenX:number,
/** 相对起始时到当前位置移动的距离*/
endLenY:number
// /** 多点触摸时,两点之间的距离 */
// touchesLenX:number,
// /** 多点触摸时,两点之间的距离 */
// touchesLenY:number
}
export type ICanvasDomEvent = {
type: CanvasEventType;
x: number;
y: number;
detail:IcanvasDomEventDetail[],
touches:ICanvasDomEvent[];
}
export type IEventListener = (event: ICanvasEvent) => void;
export type IEventShape = {
type: CanvasEventType;
x: number;
y: number;
/** 元素本身内的坐标X */
layerX:number;
/** 元素本身内的坐标Y */
layerY:number;
touches:IEventShape[];
target:ShapeType
}
export type IEventShapeListener = (event: IEventShape) => void;
export type IEventMap = Map<string, IEventListener[]>;
export type ICanvasOptional = {
/** 选式时传递当前组件this,组合式传递 getCurrentInstance()?.proxy ?? null */
component:any|null,
/** 画布id */
canvasId:string,
}
export type IShapeOptional = {
x?: number;
y?: number;
width?: number;
height?: number;
fill?: string;
stroke?: string;
strokeWidth?: number;
opacity?: number;
visible?: boolean;
rotation?: number;
scaleX?: number;
scaleY?: number;
/** 元素相对舞台x坐标系的坐标,就是x,y为起始点,如果x,y为0就相当于是舞台的顶左 **/
offsetX?: number;
/** 元素相对舞台y坐标系的坐标,就是x,y为起始点,如果x,y为0就相当于是舞台的顶左 **/
offsetY?: number;
draggable?: boolean;
// 元素之间上下重叠时,是否允许穿透冒泡逐层触发,默认不允许
bubbleEvent?: boolean;
rotateCenter?:CanvasRotateCenter;
// 线条样式
lineJoin?: ILineJoinType;
lineDashOffset?: number;
lineDash ?:number[] ;
lineCap?: ILineCapType;
src?:string;
// 二维码的前景块的颜色。
foreground?:string;
// 二维码内容。
qrcodeText?:string;
text?: string;
fontSize?: number;
fontFamily?: string;
textAlign?: ITextAlignType;
textBaseline?: ITextBaselineType;
padding?: number;
lineHeight?: number;
innerRadius ?: number;
outerRadius ?: number;
startAngle ?: number;
endAngle ?: number;
radius ?:number;
sides ?:number;
//多边形线的点
points ?:number[];
//多边形线是否自动闭合
closed ?:boolean;
// 多边线将连接线曲线化
tension ?:number
//将曲线平滑化
bezier ?:boolean;
// 椭圆的小径
radiusX ?:number
//椭圆的大径
radiusY ?:number
//星的角数量,默认5角星
numPoints ?: number;
pointStart?:IShapeVector2d;
pointEnd?:IShapeVector2d;
strokeGradient?:string[];
fillGradient?:string[];
clip?:boolean;
zIndex?:number;
textBgColor?:string;
}
export type IShapeBoundRect = {
x : number,
y : number,
height : number,
width : number
}
export type QrGenerateFrameResult = {
frameBuffer: number[],
width: number
}
export interface IShape {
canvas : ICanvas,
x: number;
y: number;
width: number;
height: number;
fill: string;
stroke: string;
strokeWidth: number;
opacity: number;
visible: boolean;
rotation: number;
scaleX: number;
scaleY: number;
/** 元素相对舞台x坐标系的坐标,就是x,y为起始点,如果x,y为0就相当于是舞台的顶左 **/
offsetX: number;
/** 元素相对舞台y坐标系的坐标,就是x,y为起始点,如果x,y为0就相当于是舞台的顶左 **/
offsetY: number;
draggable: boolean;
// 元素之间上下重叠时,是否允许穿透冒泡逐层触发,默认不允许
bubbleEvent: boolean;
rotateCenter:CanvasRotateCenter;
/**toggle方法中的选中状态 */
toggleStatus:boolean;
// 线条样式
lineJoin: ILineJoinType;
lineDashOffset: number;
lineDash:number[]
lineCap: ILineCapType;
// text数据
text : string;
fontSize : number;
fontFamily : string ;
textAlign : ITextAlignType;
textBaseline : ITextBaselineType;
padding : number;
lineHeight : number;
//ring数据
innerRadius : number;
outerRadius : number;
startAngle : number;
endAngle : number;
radius :number;
sides: number;
src:string;
// 二维码的前景块的颜色。
foreground:string;
// 二维码内容。
qrcodeText:string;
points :number[];
//多边形线是否自动闭合
closed :boolean;
// 多边线将连接线曲线化
tension:number
bezier :boolean;
// 椭圆的小径
radiusX :number;
//椭圆的大径
radiusY :number;
//星的角数量,默认5角星
numPoints: number;
pointStart:IShapeVector2d;
pointEnd:IShapeVector2d;
strokeGradient:string[];
fillGradient:string[];
clip:boolean;
zIndex:number;
textBgColor:string;
drag : (eventName : CanvasEventType, parentEventDetail : ICanvasEvent) => void
draw(ctx: CanvasRenderingContext2D): void;
isPointInPath(x: number, y: number,shapeId:string): boolean;
getBoundRect() : IShapeBoundRect;
setAttr(key:string,value:any):void;
getAttr(key: string): any | null;
toggle(call:(status:boolean,target:any)=>void):void;
}