SOUI 皮肤对象系统¶
概述¶
SOUI 的皮肤对象系统是界面外观定制的核心组件,它通过不同类型的皮肤对象提供了丰富的界面外观定制能力。每种皮肤类型都针对特定的使用场景进行了优化,开发者可以根据需求选择合适的皮肤类型。
皮肤类型¶
图片列表皮肤 (SSkinImgList)¶
用于处理多状态的图片资源,将多个状态的图片水平或垂直排列在一张图片中。
- 支持多状态图片
- 水平/垂直排列方式
- 适用于按钮、图标等多状态控件
九宫格图片皮肤 (SSkinImgFrame)¶
专门用于需要自适应大小的图片资源,通过九宫格技术保持边框效果。
- 支持图片自适应拉伸
- 保持边框效果
- 适用于窗口背景、按钮等需要自适应大小的场景
纯色皮肤 (SSkinColorRect)¶
最简单高效的皮肤类型,用于绘制纯色区域。
- 支持纯色填充
- 支持边框和圆角
- 适用于简单的背景、分割线等
渐变皮肤 (SSkinGradation)¶
用于创建渐变效果的皮肤类型。
- 支持线性渐变
- 水平/垂直渐变方向
- 适用于标题栏、工具栏等需要渐变效果的场景
按钮皮肤 (SSkinButton)¶
专门为按钮控件优化的皮肤类型。
- 丰富的状态支持
- 支持边框和圆角
- 适用于各类按钮场景
形状皮肤 (SSkinShape)¶
用于绘制各种基本几何形状的皮肤类型。
- 支持多种基本形状
- 自定义路径绘制
- 适用于需要矢量图形的场景
组皮肤 (SSKinGroup)¶
组皮肤类型,用于将多个皮肤组合在一起,实现更丰富的视觉效果。
选择建议¶
场景选择¶
1. 按钮类控件¶
- 多状态图片:使用
SSkinImgList
- 自适应大小:使用
SSkinImgFrame
- 纯色按钮:使用
SSkinButton
2. 背景绘制¶
- 纯色背景:使用
SSkinColorRect
- 渐变背景:使用
SSkinGradation
- 图片背景:使用
SSkinImgFrame
3. 装饰元素¶
- 基本图形:使用
SSkinShape
- 分割线:使用
SSkinColorRect
- 图标:使用
SSkinImgList
性能考虑¶
1. 高性能场景¶
- 优先使用
SSkinColorRect
- 避免复杂的渐变效果
- 控制图片大小
2. 内存优化¶
- 合理使用图片资源
- 适当使用九宫格技术
- 考虑使用矢量图形
3. 动态效果¶
- 使用
SSkinGradation
实现渐变 - 通过
SSkinShape
实现动画 - 合理使用状态切换
最佳实践¶
1. 资源管理¶
// 集中管理皮肤资源
class CSkinManager {
public:
// 获取按钮皮肤
static ISkinObj* GetButtonSkin(const SStringW& strName);
// 获取背景皮肤
static ISkinObj* GetBackgroundSkin(const SStringW& strName);
// 获取图标皮肤
static ISkinObj* GetIconSkin(const SStringW& strName);
};
2. 性能优化¶
// 皮肤缓存管理
class CSkinCache {
public:
// 缓存皮肤对象
static void CacheSkin(const SStringW& strName,
ISkinObj* pSkin);
// 获取缓存的皮肤
static ISkinObj* GetCachedSkin(const SStringW& strName);
// 清理缓存
static void ClearCache();
};
3. 调试支持¶
// 皮肤调试助手
class CSkinDebugger {
public:
// 输出皮肤信息
static void DumpSkinInfo(ISkinObj* pSkin);
// 检查皮肤使用情况
static void CheckSkinUsage();
// 性能分析
static void AnalyzePerformance();
};
扩展开发¶
1. 创建自定义皮肤¶
class CCustomSkin : public SSkinObjBase
{
SOUI_CLASS_NAME(CCustomSkin, L"custom_skin")
public:
// 实现必要的接口
BOOL Draw(IRenderTarget *pRT, LPCRECT rcDraw,
DWORD dwState, BYTE byAlpha) override;
};
2. 注册自定义皮肤¶
// 注册自定义皮肤
SApplication::getSingleton().RegisterSkinFactory(
CCustomSkin::GetClassName(),
[](SObjectInfo &info) -> ISkinObj* {
return new CCustomSkin();
});
相关资源¶
注意事项¶
1. 资源管理¶
- 及时释放皮肤资源
- 避免重复创建皮肤对象
- 合理使用缓存机制
2. 性能优化¶
- 选择合适的皮肤类型
- 控制资源大小
- 优化绘制逻辑
3. 兼容性¶
- 处理不同分辨率
- 考虑不同设备特性
- 提供降级方案