Skip to Content

按 API 自定义 Pad / Split

标准场景优先使用 builder 自带方法(padpadAutopadByPxsplitsplitByPx)。
当需要复杂布局(例如槽位区域外侧栏)时,可自定义 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