Skip to content

[Feature Request] 悬浮宠物增加「超大」档或自定义缩放:当前所有档位的可调范围只有 46→56pt #294

Description

@wpk865147933

背景

我用独立悬浮宠物形态(surfaceMode = floatingPet),「宠物大小」已经调到最大的「较大」,但在 16" MacBook Pro 内置屏上还是偏小。

翻了下代码,发现这不是我没调对,而是当前尺寸的可调范围确实很窄,所以来提个需求。

现状

PingIsland/UI/Views/DetachedIslandPanelView.swift(v0.28.3):

init(scale: CGFloat) {
    let sanitizedScale = min(max(scale, 1), 1.22)   // 硬上限 1.22
    ...
    self.mascotDisplaySize = 46 * sanitizedScale
}

static func resolutionScale(for screenRect: CGRect, sizeMode: FloatingPetSizeMode) -> CGFloat {
    switch sizeMode {
    case .standard:  return 1
    case .automatic: return automaticResolutionScale(for: screenRect)
    case .large:     return max(1.16, automaticResolutionScale(for: screenRect))
    }
}

private static func automaticResolutionScale(for screenRect: CGRect) -> CGFloat {
    let baseArea: CGFloat = 1440 * 900
    let area = max(screenRect.width * screenRect.height, baseArea)
    let linearScale = sqrt(area / baseArea)
    return min(1.22, 1 + ((linearScale - 1) * 0.45))
}

按这段逻辑算了下各档位的实际结果(我的机器:MacBook Pro 16",逻辑分辨率 1728×1117):

档位 scale mascotDisplaySize
标准 1.000 46.00 pt
自动 1.099 50.56 pt
较大 1.160 53.36 pt
理论上限(clamp 1.22) 1.220 56.12 pt

两个观察:

1. 在 MacBook 内置屏上,「较大」恒等于 1.16。
automatic 要超过 1.16,需要逻辑分辨率面积 ≥ 2,381,439 pt²(同比例下约 1919×1241 pt)。内置屏无论选哪个缩放档都到不了:

逻辑分辨率 automatic large mascot
1512×982(更大文字) 1.032 1.160 53.36 pt
1728×1117(默认) 1.099 1.160 53.36 pt
1920×1080(更多空间) 1.119 1.160 53.36 pt
2560×1440(27" 5K 外接) 1.220 1.220 56.12 pt

也就是说 max(1.16, automatic) 里的 automatic 在内置屏上永远不生效,换任何缩放档宠物的点尺寸都不变。

2. 三个档位 + 所有显示器加起来,宠物的总可调范围只有 46 → 56.12 pt(+22%),而内置屏用户实际只能拿到 46 → 53.36 pt(+16%)。「较大」相对「标准」只大了 16%,比档位名字给人的预期小不少。

期望

希望能有一个明显更大的选项,下面任选其一就行:

  1. 新增 extraLarge(超大)档,比如 scale 1.5 / 1.75;
  2. 把「宠物大小」改成滑杆(比如 0.8×–2.0×),跟已有的「设置面板大小」「文字大小」保持一致的交互;
  3. 最小改动:放宽 sanitizedScale 的 clamp 上限,并让 large 用一个不依赖分辨率的固定值(现状是内置屏上分辨率这一维本来就没起作用)。

附注:放大应该是低风险的

宠物是 MascotView 的 SwiftUI Canvas 矢量绘制,而且 DetachedFloatingMascotView 已经在按 mascotRenderScale = 1.75 超采样渲染后再缩回去:

private var renderSize: CGFloat {
    petMetrics.mascotDisplaySize * DetachedIslandPanelMetrics.mascotRenderScale
}
private var displayScale: CGFloat {
    petMetrics.mascotDisplaySize / renderSize
}

所以放大本身不会糊。需要跟着调的主要是 petVisualFrame / petHitFrame / badgeOffset / floatingUsageBoltVerticalOffset —— 这几个已经统一按 sanitizedScale 联动了,以及气泡(DetachedIslandBubblePlacement)的避让边界。

如果方向 OK,我也可以来提 PR。

环境

  • Ping Island 0.28.3 (build 76)
  • macOS 26.2 (25C56),MacBook Pro 16",内置 Liquid Retina XDR,逻辑分辨率 1728×1117,backingScale 2.0
  • 形态:独立悬浮宠物(surfaceMode = floatingPetfloatingPetSizeMode = large

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions