Skip to content

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;
}
最近更新