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

本文将详细解析CircleClass基础类及其子类的实现原理,这些类是实现TabBar圆形效果的核心。

@Observed
class CircleClass {
@Track
width: number;
@Track
height: number;
@Track
menuLength: number = 0;
constructor(options: CircleClassConstructorType) {
this.width = options.width;
this.height = options.height;
this.menuLength = options.menuLength;
}
}@Observed装饰器:@Track装饰器:width: 组件宽度height: 组件高度menuLength: 菜单项数量getMinWidth(): number {
return utilGetMinWidth(this.width, this.height, this.menuLength);
}
getMenuCenterX(index: number): number {
let itemWidth = this.width / this.menuLength;
let basicsX = itemWidth * index;
let centerWidth = itemWidth / 2;
return basicsX + centerWidth;
}getMinWidth():getMenuCenterX():index:当前菜单项索引@Observed
export class ConcaveCircle extends CircleClass {
@Track
positionX: number = 0;
@Track
positionY: number = 0;
oldPositionX: number = 0;
oldPositionY: number = 0;
@Track
circleRadius: number = 0;
@Track
circleDiameter: number = 0;
constructor(context: CanvasRenderingContext2D, menuLength: number) {
super({
width: context.width,
height: context.height,
menuLength: menuLength
});
this.initCircleRadius();
this.resetXY();
}
}positionX/Y: 当前位置oldPositionX/Y: 上一次位置circleRadius: 圆形半径circleDiameter: 圆形直径 initCircleRadius(): void {
this.circleRadius = this.getMinWidth() / 2 - SURPLUSRADIUS;
this.circleDiameter = this.circleRadius * 2;
}
resetXY(): void {
this.positionY = -this.circleRadius;
this.positionX = this.getAutoPositionX(0);
this.oldPositionX = 0;
this.oldPositionY = 0;
}getAutoPositionX(index: number): number {
return this.getMenuCenterX(index) - this.circleRadius;
}
setPositionXY(position: RaisedCircleSetPostionXYType): void {
if (position.x || position.x === 0) {
this.oldPositionX = this.positionX;
this.positionX = position.x;
}
if (position.y || position.y === 0) {
this.oldPositionY = this.positionY;
this.positionY = position.y;
}
}CircleClass及其子类通过:
实现了:
这些类为TabBar的圆形效果提供了坚实的基础实现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。