按 API 自定义 Pad / Split
标准场景优先使用 builder 自带方法(pad、padAuto、padByPx、split、splitByPx)。
当需要复杂布局(例如槽位区域外侧栏)时,可自定义 spec。
自定义 PadSpec(左侧栏)
import link.botwmcs.fizzy.ui.element.ElementPainter;
import link.botwmcs.fizzy.ui.frame.FramePainter;
import link.botwmcs.fizzy.ui.pad.PadSpec;
import java.util.List;
public record LeftSidebarPadSpec(int widthPx, int gapPx, List<ElementPainter> elements) implements PadSpec {
@Override
public PadBounds resolve(FramePainter frame, FramePainter.SlotArea slotArea) {
var layout = frame.layout();
int h = slotArea != null ? slotArea.h() : layout.h();
int y = slotArea != null ? slotArea.y() : layout.top();
int x = layout.left() - Math.max(0, gapPx) - Math.max(0, widthPx);
return new PadBounds(x, y, Math.max(0, widthPx), Math.max(0, h));
}
}自定义 SplitPainter
import link.botwmcs.fizzy.ui.split.FizzySplitMetrics;
import link.botwmcs.fizzy.ui.split.SplitMetrics;
import link.botwmcs.fizzy.ui.split.SplitPainter;
import link.botwmcs.fizzy.ui.split.SplitType;
import net.minecraft.client.gui.GuiGraphics;
public final class DotSplitPainter implements SplitPainter {
private static final SplitMetrics METRICS = FizzySplitMetrics.ofDefault();
@Override
public void paint(GuiGraphics g, int x, int y, int lengthPx, SplitType type) {
if (type == SplitType.VERTICAL) {
for (int i = 0; i < lengthPx; i += 2) {
g.fill(x, y + i, x + 1, y + i + 1, 0xFF57D7FF);
}
} else {
for (int i = 0; i < lengthPx; i += 2) {
g.fill(x + i, y, x + i + 1, y + 1, 0xFF57D7FF);
}
}
}
@Override
public SplitMetrics metrics() {
return METRICS;
}
}注意事项
FizzyGuiBuilder 当前没有公开的 splitPainter(...)。
如需挂载自定义 PadSpec / SplitPainter,建议通过 proxy 侧 KernelUiSpec 注入:
KernelUiSpec uiSpec = KernelUiSpec.builder()
.addPad(new LeftSidebarPadSpec(
90,
8,
List.of(FizzyComponentElement.singleLine("Sidebar"))
))
.splitPainter(new DotSplitPainter())
.addSplit(new PixelSplitSpec(0, 0, 120, SplitType.VERTICAL))
.build();Last updated on