组件类型: UI 控件示例
版本: v0.0.1
作者: Bit HCI Team
Switch 是一个可交互的开关组件,展示了如何实现具有状态管理、鼠标交互和平滑动画的 UI 控件。
- ✅ 鼠标交互: 点击切换开关状态
- ✅ 键盘控制: 空格键切换,ESC 退出
- ✅ 平滑动画: 旋钮位置平滑过渡
- ✅ 状态反馈: 颜色和文本显示当前状态
- ✅ 圆角设计: 使用圆形和矩形组合实现圆角效果
switch/
├── switch.cpp # 组件实现
├── CMakeLists.txt # 构建配置
├── README.md # 本文档
└── assets/ # 组件资源
└── shaders/ # 着色器源码
├── triangle.vert # 顶点着色器(GLSL)
├── triangle.frag # 片段着色器(GLSL)
├── compile_shaders.bat # 着色器编译脚本
└── spv/ # 编译后的SPIR-V
├── triangle_vert.spv
└── triangle_frag.spv
着色器说明:
- Switch 组件有自己的独立着色器
- 使用与 Triangle 相同的基础渲染管线(顶点位置 + 顶点颜色)
- Native 运行时自动根据组件名称从
assets/shaders/spv/加载 - 圆形和矩形都是由三角形组成,使用相同的着色器渲染
OFF 状态 ON 状态
┌──────────────┐ ┌──────────────┐
│ ⚪ │ │ ⚪ │
│ │ → │ │
└──────────────┘ └──────────────┘
灰色 绿色
- 关闭状态: 灰色背景 (RGB: 0.3, 0.3, 0.3)
- 打开状态: 绿色背景 (RGB: 0.2, 0.8, 0.3)
- 旋钮: 白色 (RGB: 0.95, 0.95, 0.95)
- 背景: 深蓝灰 (RGB: 0.15, 0.15, 0.2)
- 左键点击开关: 切换开/关状态
- 鼠标悬停: 显示 "Click!" 提示
- 空格键: 切换开关状态
- ESC 键: 退出程序
class SwitchComponent : public BitHCI::IComponent {
private:
bool isOn = false; // 开关状态
float knobPosition = 0.0f; // 旋钮位置 (0.0~1.0)
float animationSpeed = 8.0f; // 动画速度
public:
void onUpdate(float deltaTime) {
// 鼠标点击检测
if (isMouseClickedOnSwitch()) {
isOn = !isOn;
}
// 平滑动画
float target = isOn ? 1.0f : 0.0f;
knobPosition = lerp(knobPosition, target, animationSpeed * deltaTime);
}
void onRender() {
// 绘制背景(圆角矩形)
drawRoundedRectangle(...);
// 绘制旋钮
renderer->drawCircle(knobX, knobY, radius, color);
// 绘制状态文本
renderer->drawText(isOn ? "ON" : "OFF", ...);
}
};- IRenderer::drawRectangle() - 绘制矩形背景
- IRenderer::drawCircle() - 绘制圆角和旋钮
- IRenderer::drawText() - 绘制状态文本
- IInput::isMouseButtonPressed() - 检测鼠标按键
- IInput::getMousePosition() - 获取鼠标位置
- IInput::isKeyJustPressed() - 检测键盘按键
- IWindow::close() - 关闭窗口
void drawRoundedRectangle(float x, float y, float w, float h, float radius) {
// 中心矩形
renderer->drawRectangle(x + radius, y, w - 2*radius, h, color);
// 左右两个圆角
renderer->drawCircle(x + radius, y + h/2, radius, color);
renderer->drawCircle(x + w - radius, y + h/2, radius, color);
// 上下填充
renderer->drawRectangle(x, y + radius, radius, h - 2*radius, color);
renderer->drawRectangle(x + w - radius, y + radius, radius, h - 2*radius, color);
}cd examples/cpp/switch
mkdir build
cd build
cmake -G "Visual Studio 17 2022" -A x64 ..
cmake --build . --config Releasecd native
.\build\Release\bitui_native.exe ..\examples\cpp\switch\build\Release\switch.dll或者从项目根目录:
cd "d:\_Bit_OS\Bit HCI\native"
.\build\Release\bitui_native.exe "..\examples\cpp\switch\build\Release\switch.dll"- 使用
bool isOn管理开关状态 - 使用
float knobPosition实现平滑动画 - 通过插值实现状态过渡
- 检测鼠标点击事件
- 计算鼠标位置是否在控件区域内
- 实现点击反馈
- 使用线性插值(Lerp)实现平滑过渡
- 基于
deltaTime的帧率独立动画 - 目标值和当前值的平滑追踪
- 使用基础图形(矩形、圆形)组合出复杂形状
- 圆角矩形的实现技巧
- 分层绘制(背景、前景、文本)
- 添加音效: 切换时播放音效
- 震动反馈: 点击时添加视觉震动效果
- 不同主题: 实现多种颜色方案
- 尺寸自适应: 根据窗口大小调整开关尺寸
- 多个开关: 支持同时显示多个开关
- 禁用状态: 实现禁用状态和样式
- 事件回调: 实现状态变化回调机制
- 数据绑定: 与外部数据模型双向绑定
- 自定义样式: 支持自定义颜色、尺寸、动画
- 渲染图元: ~10 个(矩形 + 圆形 + 文本)
- 内存占用: < 1KB
- CPU 占用: 极低(仅在动画时有计算)
- 响应延迟: < 16ms (60 FPS)
drawRectangle 未实现: 需要在 Runtime API 中实现drawCircle 未实现: 需要在 Runtime API 中实现drawText 未实现: 需要在 Runtime API 中实现- 圆角渲染: 当前为简化实现,可能有缝隙
学习完 Switch 组件后,您可以:
- 实现 Slider 组件: 滑动条控件
- 实现 Button 组件: 按钮控件
- 实现 Checkbox 组件: 复选框控件
- 组合控件: 创建包含多个开关的设置面板
组件状态: drawRectangle 和 drawCircle API
最后更新: 2025-10-11
维护者: Bit HCI Team