
温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

本文将详细解析TabBar中的工具函数和Canvas绘制实现,包括图片处理、尺寸计算和Canvas绘制等核心功能。

export function getImageUrl(item: TabMenusInterfaceIRequired, index: number,
selectIndex: number): PixelMap | ResourceStr | DrawableDescriptor {
if (index === selectIndex) {
if (item.selectImage) {
return item.selectImage;
}
}
return item.image!;
}item: 菜单项配置index: 当前项索引selectIndex: 选中项索引PixelMap: 像素图ResourceStr: 资源字符串DrawableDescriptor: 可绘制描述符export function getMinWidth(width: number, height: number, menuLength: number = 0): number {
return Math.min(width / menuLength, height);
}
export function getChamferXY(itemHeight: number, r: number = 30): [number, number] {
let topH = itemHeight / 3;
let center = itemHeight / 2;
let cenToTop = center - topH;
let chamferY = cenToTop + r;
let sr = r + center;
let chamferX = Math.sqrt(Math.pow(sr, 2) - Math.pow(chamferY, 2));
return [chamferX, chamferY];
}getMinWidth函数:getChamferXY函数:export function CanvasCreateRectangle(canvasInfo: CanvasCreateRectangleType) {
let ctx = canvasInfo.context;
let cW = canvasInfo.context.width;
let cH = canvasInfo.context.height;
ctx.clearRect(0, 0, cW, cH);
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(cW, 0);
ctx.lineTo(cW, cH);
ctx.lineTo(0, cH);
ctx.closePath();
ctx.fillStyle = canvasInfo.tabsBgColor;
ctx.fill();
ctx.closePath();
}export function CanvasClipGroove(canvasInfo: CanvasClipGrooveType) {
let ctx = canvasInfo.context;
let cW = ctx.width;
let cH = ctx.height;
let radius = getMinWidth(cW, cH, canvasInfo.menuLength) / 2;
let Center = canvasInfo.center || cW / 2;
let aroundCenter = Math.sqrt(Math.pow(radius * 2, 2) - Math.pow(radius, 2));
const chamferDegrees1 = Math.PI / 180;
const chamferDegrees330 = chamferDegrees1 * 330;
const chamferDegrees270 = chamferDegrees1 * 270;
const chamferDegrees210 = chamferDegrees1 * 210;
const chamferDegrees150 = chamferDegrees1 * 150;
const chamferDegrees30 = chamferDegrees1 * 30;
ctx.beginPath();
ctx.arc(Center - aroundCenter, radius, radius, chamferDegrees270, chamferDegrees330);
ctx.arc(Center, 0, radius, chamferDegrees30, chamferDegrees150);
ctx.arc(Center + aroundCenter, radius, radius, chamferDegrees210, chamferDegrees270);
ctx.closePath();
ctx.clip();
ctx.clearRect(0, 0, cW, cH);
}工具函数和Canvas绘制通过:
实现了:
这些实现为TabBar提供了强大的底层支持,确保了组件的视觉效果和性能表现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。