这一章补充一个效果,在多选的情况下,对目标进行对齐。基于多选整体区域对齐的基础上,还支持基于其中一个节点进行对齐。
请大家动动小手,给我一个免费的 Star 吧~
大家如果发现了 Bug,欢迎来提 Issue 哟~
基于整体的对齐
垂直居中
水平居中
左对齐
右对齐
上对齐
下对齐
基于目标节点的对齐
垂直居中(基于目标节点)
水平居中(基于目标节点)
左对齐(基于目标节点)
右对齐(基于目标节点)
上对齐(基于目标节点)
下对齐(基于目标节点)
对齐逻辑
放在 src/Render/tools/AlignTool.ts
import {
Render } from '../index'
//
import * as Types from '../types'
import * as Draws from '../draws'
import Konva from 'konva'
export class AlignTool {
static readonly name = 'AlignTool'
private render: Render
constructor(render: Render) {
this.render = render
}
// 对齐参考点
getAlignPoints(target?: Konva.Node | Konva.Transformer): {
[index: string]: number } {
let width = 0,
height = 0,
x = 0,
y = 0
if (target instanceof Konva.Transformer) {
// 选择器
// 转为 逻辑觉尺寸
;[width, height] = [
this.render.toStageValue(target.width()),
this.render.toStageValue(target.height())
]
;[x, y] = [
this.render.toStageValue(target.x()) - this.render.rulerSize,
this.render.toStageValue(target.y()) - this.render.rulerSize
]
} else if (target !== void 0) {
// 节点
// 逻辑尺寸
;[width, height] = [target.width(), target.height()]
;[x, y] = [target.x(), target.y()]
} else {
// 默认为选择器
return this.getAlignPoints(this.render.transformer)
}
return {
[Types.AlignType.垂直居中]: x + width / 2,
[Types.AlignType.左对齐]: x,
[Types.AlignType.右对齐]: x + width,
[Types.AlignType.水平居中]: y + height / 2,
[Types.AlignType.上对齐]: y,
[Types.AlignType.下对齐]: y + height
}