Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
一直想把引擎的UI部分做强做大可是发现这个难度还是不小
所以只能一步一步蚕食之
一步一步来吧
先说下控件布局管理器吧
布局管理器的目的是按照一定规则排列控件于给定范围内
这是其基本目的
很显然基本的布局管理对象应该包含以下2个基本功能
1.控件的加入和删除
2.应用布局管理器
当然也可以有其他附加功能
比如获取控件个数等等
所以我把抽象控件布局对象设计如下:

///////////////////////////////////////////////////////////
/// 定义引擎UI布局管理器
///////////////////////////////////////////////////////////
class GAPI UI_AbstractLayouter : public Object
{
public:
    typedef std::list
<UI_Widget*> Widgets;
public:
    UI_AbstractLayouter();
    
virtual ~UI_AbstractLayouter();
public:
    
////////////////////////////////////////////////////////////
    
/// 布局管理器加载控件
    
////////////////////////////////////////////////////////////
    void AddWidget(UI_Widget* widget);

    
////////////////////////////////////////////////////////////
    
/// 布局管理器移除控件
    
////////////////////////////////////////////////////////////
    void RemoveWidget(UI_Widget* widget);

    
////////////////////////////////////////////////////////////
    
/// 布局管理器移除所有子控件
    
////////////////////////////////////////////////////////////
    void RemoveAllWidget();

    
////////////////////////////////////////////////////////////
    
/// 布局管理器控件排列
    
////////////////////////////////////////////////////////////
    virtual void ApplyLayouter(UI_Widget* parent) = 0;
protected:
    Widgets  widgets_;
private:
    DECLARE_OBJECT(UI_AbstractLayouter)
};

然后就是具体的几种布局管理器对象了
下面是我当前弄的4种布局管理器了
分别为:
UI_FlowLayouter
    流式布局管理的布局策略是从左到右依次设定控件位置如果超出父控件则按照设定的竖直布局换行重新布局(注意它并不改变控件的大小)
UI_GridLayouter
    格子布局管理的策略则是工具设定布局间隔和子控件,父亲控件个数重写设置所有的子控件大小(这样所有的子控件大小就一样了)然后把所有的子控件放置在一个一个的格子中
UI_VLayouter
   UI_VLayouter和UI_HLayouter则是我从QT中借鉴来的
   IU_VLayouter把所有子控件按照从上到下的方式依次布局(不改变子控件大小)(可能会超出父控件喔)
UI_HLayouter
   这个就不说了

当然还可以定制其他布局管理器了
   比如UI_DockLayouter
       UI_CenterLayouter等等基本原理都是一样的

做了游戏引擎这么久说实话
UI真是一个大块头
对于UI我的设计理念就是使用简单,功能丰富

题外话1:08年11月的时候我就想设计一套UI库
之前认为游戏UI是使用windows API话的 呵呵
题外话2:网上关于使用一些UI库的例子很多但是关于设计UI库的例子似乎不多
题外话3:说实话我觉得写博客是交流思想共同探讨而非其他



posted on 2010-09-27 20:09 ccsdu2009 阅读(2603) 评论(5)  编辑 收藏 引用 所属分类: Game引擎
Comments
  • # re: UI设计概要1:控件布局管理器
    陈梓瀚(vczh)
    Posted @ 2010-09-29 13:05
    UIGridLayout做的应该是自动排版哈,譬如说一个cell占了50%,另一个cell使用控件的autosize,第三个cell使用控件的suggestion四则,第四个cell保持30像素,然后UIGridLayout自己拥有了一个minsize和maxsize,因此跟他的容器绑定了。所以你的layout可以一个套一个,这样才能达到效果。  回复  更多评论   
  • # re: UI设计概要1:控件布局管理器
    2009
    Posted @ 2010-09-29 15:09
    @陈梓瀚(vczh)
    呵呵 我这里的设计是GridLayouter会把所有子控件都统一大小喔  回复  更多评论   
  • # re: UI设计概要1:控件布局管理器
    陈梓瀚(vczh)
    Posted @ 2010-09-29 17:24
    @2009
    你是泥其道而行之……没有什么理由一定要把所有控件都统一大小的。不过话说回来,如果你真的需要这么干,那么cell都设置成100%(到时候会除以总数)就行了。因此这是包含和被包含的关系哈。  回复  更多评论   
  • # re: UI设计概要1:控件布局管理器
    2009
    Posted @ 2010-09-30 15:05
    @陈梓瀚(vczh)
    我当前需要的是拿出一整套UI库
    而不是纠结于细节
    等这个库弄好了
    根据需要再处理还是比较好  回复  更多评论   
  • # re: UI设计概要1:控件布局管理器
    2009
    Posted @ 2010-09-30 17:48
    我们缺少的是一个完备的UI库 O(∩_∩)O~  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理