Appearance
手机GUI
文档版本:基于 2026-06-01 代码分析
概述
手机GUI是逃走中MOD最重要的客户端界面,模拟真实智能手机的操作体验。以 NFAPhoneScreen 为核心容器,包含 10 种页面类型,支持 APP 网格桌面、锁屏滑动解锁、拨号盘、联系人、通话、消息、逃走中通知等功能。
手机界面以 2560x1440 为屏幕基准分辨率,通过 PhoneUiScale 按 Math.min(screenW/baseW, screenH/baseH) 等比缩放。手机本体尺寸为 637×1065 基准像素,支持左下/右下停靠偏好(通过 PhoneClientConfig 的 phone_ui.position 配置项切换)。
核心概念
10 种页面类型
| 枚举值 | 类 | 功能 |
|---|---|---|
LOCK | NFAPhoneLockScreenPage | 锁屏:数字时钟、机主名、"上滑解锁" |
MAIN | NFAPhoneMainScreenPage | 桌面:4列APP图标网格+红点通知 |
CONTACTS | NFAPhoneContactsPage | 联系人列表+搜索 |
CONTACT_DETAIL | NFAPhoneContactDetailPage | 联系人名片+操作按钮 |
CALLS | NFAPhoneCallsPage | 拨号盘+通话记录 |
CALL_SESSION | NFAPhoneCallSessionPage | 通话中界面 |
MESSAGES | NFAPhoneMessagesPage | 消息线程列表 |
MESSAGE_DETAIL | NFAPhoneMessageDetailPage | 对话详情 |
RFM | NFAPhoneRfmPage | 逃走中APP首页 |
RFM_NOTICES | NFAPhoneRfmNoticesPage | 逃走中通知卡片列表 |
架构设计
屏幕框架层级
mermaid
graph TB
subgraph Screen["NFAPhoneScreen (Screen + MenuAccess)"]
Frame["PhoneScreenFrame<br/>坐标计算: 外框/显示区/Home键/顶部栏"]
Renderer["PhoneScreenFrameRenderer<br/>九宫格背景/Home键/状态栏"]
Pages["Map<PhonePageType, NFAPhonePage><br/>10个页面映射"]
Current["currentPage<br/>当前活跃页面"]
end
subgraph Atlas["纹理图集 (3个)"]
Base["PHONE_BASE<br/>256x280 手机壳/APP图标"]
Widgets["PHONE_WIDGETS<br/>256x256 按钮九宫格/HUD"]
Time["TIME_DISPLAY<br/>128x128 数码管数字"]
end
subgraph Render["渲染工具"]
NineSlice["PhoneUiRenderManager<br/>九宫格拉伸/缩放区域"]
Number["PhoneUiNumberManager<br/>数码管数字渲染"]
Scale["PhoneUiScale<br/>基准分辨率等比缩放"]
end
Screen --> Atlas
Screen --> Render页面导航流程
mermaid
flowchart TD
LOCK["LOCK<br/>锁屏"] -->|"上滑解锁"| MAIN["MAIN<br/>桌面"]
MAIN -->|"点击APP"| CONTACTS["CONTACTS<br/>联系人"]
MAIN -->|"点击APP"| CALLS["CALLS<br/>拨号盘"]
MAIN -->|"点击APP"| MESSAGES["MESSAGES<br/>消息"]
MAIN -->|"点击APP"| RFM["RFM<br/>逃走中APP"]
CONTACTS -->|"点击联系人"| CONTACT_DETAIL["CONTACT_DETAIL<br/>名片详情"]
CALLS -->|"通话建立"| CALL_SESSION["CALL_SESSION<br/>通话中"]
MESSAGES -->|"点击线程"| MESSAGE_DETAIL["MESSAGE_DETAIL<br/>对话"]
RFM -->|"自动跳转"| RFM_NOTICES["RFM_NOTICES<br/>通知列表"]
CALL_SESSION -.->|"自动跳转(来电)"| LOCK关键文件
| 文件 | 说明 |
|---|---|
com/chenxi/chenxi_rfm/client/screen/NFAPhoneScreen.java | 手机屏幕容器 |
com/chenxi/chenxi_rfm/client/screen/phone/core/NFAPhonePage.java | 页面接口 |
com/chenxi/chenxi_rfm/client/screen/phone/core/PhonePageType.java | 页面类型枚举 |
com/chenxi/chenxi_rfm/client/screen/phone/shell/PhoneScreenFrame.java | 框架坐标计算 |
com/chenxi/chenxi_rfm/client/screen/phone/shell/PhoneScreenFrameRenderer.java | 框架渲染 |
com/chenxi/chenxi_rfm/client/screen/phone/shell/NFAPhoneLockScreenPage.java | 锁屏页 |
com/chenxi/chenxi_rfm/client/screen/phone/shell/NFAPhoneMainScreenPage.java | 桌面主页 |
com/chenxi/chenxi_rfm/client/ui/phone/PhoneUiRenderManager.java | 九宫格/缩放渲染 |
com/chenxi/chenxi_rfm/client/ui/phone/PhoneUiNumberManager.java | 数码管数字渲染 |
com/chenxi/chenxi_rfm/client/ui/phone/PhoneUiStyle.java | UI 坐标常量 |
com/chenxi/chenxi_rfm/client/ui/phone/PhoneUiScale.java | 等比缩放工具 |
com/chenxi/chenxi_rfm/client/ui/atlas/ClientUiAtlasManager.java | 图集管理器 |
com/chenxi/chenxi_rfm/client/event/ClientPhoneCallHudEvents.java | 通话状态HUD(非手机界面时叠加) |
com/chenxi/chenxi_rfm/client/config/PhoneClientConfig.java | 手机UI客户端配置(位置偏好等) |
关键流程
桌面 APP 网格
- 4 列网格布局,动态计算列间距
- 预置 5 个 APP:注册(register)、联系人(contacts)、电话(calls)、信息(messages)、逃走中(rfm)
- 每个 APP 由
AppDefinitionrecord 定义(名称、显示名、图集 UV坐标) - 支持红点通知标记
锁屏滑动解锁
- 上滑拖动检测 Y 轴偏移
- 达到阈值(
DRAG_UNLOCK_THRESHOLD = 0.4)视为解锁 - 插值动画过渡
通话自动跳转
- 当客户端检测到进行中的通话(
PhoneClientCallState),init()强制跳转到CALL_SESSION页面 - 记录返回页,通话结束后恢复
UI 组件
- 九宫格渲染:
drawNineSlice()用于按钮、面板、HUD 背景 - 数字时钟:从
TIME_DISPLAY图集读取 0-9 字形(8x15像素每字) - 搜索输入框:
PhoneSearchBox用于联系人/名称搜索
注意事项
- 手机界面以 2560x1440 基准分辨率设计,低分辨率下可能模糊
- 所有页面实现
NFAPhonePage接口,坐标使用偏移参数传递 - 图集 UV 坐标硬编码在
PhoneUiStyle中 - 通话中打开手机会自动跳到通话页面
- 页面间导航通过
navigateTo(PhonePageType)实现 - 通话HUD:当手机界面关闭但通话进行中时,
ClientPhoneCallHudEvents会在屏幕右侧渲染通话状态条(显示对方名称和通话状态),基于 1440p 高度等比缩放