import { JsvTextureStoreApi, } from "jsview"; declare interface CacheInfoType { borderRadius: number; lineWidth: number; canvasSourceId: String; borderOutset: number; canvasWidth: number; } let sCurrentCacheList: Array = []; function checkCache(border_radius: number, line_width: number): CacheInfoType | null { for (let cache_item of sCurrentCacheList) { if (cache_item.borderRadius == border_radius && cache_item.lineWidth == line_width) { return cache_item; } } return null; } function BuildFrame(border_radius: number, line_width: number): CacheInfoType { let frame_cache: CacheInfoType | null; frame_cache = checkCache(border_radius, line_width); if (frame_cache != null) { return frame_cache; } let sampleImageWidth = (border_radius + line_width + 3) * 2; let canvasRef = JsvTextureStoreApi.canvasTexture( sampleImageWidth, sampleImageWidth ); // 创建画布 let circleInnerDiameter = border_radius * 2; // 环形内直径, 为所要包括图形的borderRadius的一倍 let circleLineWidth = line_width; // 线宽 let circleRadius = Math.floor(circleInnerDiameter / 2 + circleLineWidth / 2); // 绘制线是圆圈的轨迹中线 let customPath = canvasRef.circlePath( Math.floor(sampleImageWidth / 2), Math.floor(sampleImageWidth / 2), circleRadius ); // 创建圆环绘制路径,圆形在画布的中心点位置 canvasRef.drawColor("rgba(0,0,0,0)"); // 画布绘制半透明底色 customPath!.stroke(circleLineWidth, "#000000FF"); // 以给定线宽绘制圆环 let source_id = canvasRef.commit(); // texture和div的textureStore绑定 frame_cache = { canvasWidth: sampleImageWidth, borderRadius: border_radius, lineWidth: line_width, canvasSourceId: source_id, borderOutset: Math.floor((sampleImageWidth - circleInnerDiameter) / 2), // (画布 - 圆环内直径) / 2 }; // 永远保存,不删除,界面上理论上不会有太多种转框,所以只存不清理 sCurrentCacheList.push(frame_cache); console.log("Rotate frame cache increase to " + sCurrentCacheList.length); return frame_cache; } export { BuildFrame, }