Skip to content

SOUI 皮肤对象系统

Warning

The current page still doesn't have a translation for this language.

You can read it through google translate.

概述

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. 兼容性

  • 处理不同分辨率
  • 考虑不同设备特性
  • 提供降级方案