开源跨平台移动项目Langou【视图与布局系统】

Langou简介

Langou是一个跨平台(Android/iOS)前端开发框架,核心代码使用C++编写,底层基于OpenGL绘图,上层实现了一个精简的排版引擎以及一个JS/JSX运行环境。目标是想实现在此基础上开发GUI应用程序可兼顾开发速度与运行效率。

视图View

在上一篇中我已经为大家讲了Langou入门,今天我就来介绍langou的核心部分(视图与布局)。

Viewgui核心部件派生为Notification
用它来描述屏幕上所有可见的元素,它是所有视图的基础类型它也是事件的响应者,这些事件由硬件以及操作系统触发。详细的API文档讲大家去这里查阅。

下面是langou现在提供的所有View继承关系图:
注:带*号的为抽象类型或协议没有构造函数

看到这个继承关系大家是不是觉得有点复杂了,其实这要与浏览器比那真是小巫见大巫,当然那并不是我想要的,这一切都是为了效率。当然为了效率在功能上肯定是要做裁剪的,鱼和熊掌不可兼得。

有这么多视图它到底能为我们做什么呢?

视图在广义功能上划分有两类:

非布局视图

顾名思义非布局视图就是那种不带布局功能的视图,就是你把它的位置固定后,它是不会再受到任何其它视图元素有影响,除非你再次更改它的位置translate属性。这种是最快的,因为不需要进行布局计算。

现在langou提供的非布局视图有两个:

关于这两个视图的具体API接口说明请大家查阅文档,但在这里特别要说明的是transform,也就是矩阵变换。

矩阵变换是GUI绘图系统里的一个重要概念,transform用一个Matrix来描述绘图元素点线或面在屏幕上的实际位置与形状,这个矩阵通常由一组3x34x4向量组成,3x3为2d矩阵4x4为3d矩阵,在View上使用的是一个裁剪过的3x2的2d矩阵所它暂时不支持3d中的z轴,以后的版本中可以会所变化。

View中的transform属性并没有直接暴露而是换成了一组属性:

  • x
  • y
  • scaleX
  • scaleY
  • rotateZ
  • skewX
  • skewY

你可以通过matrix属性得到这个矩阵但它是只读的,只能通过xy这个方式对它进行设置。

调用final_matrix()函数得到的是父视图的final_matrix与当前视图的matrix乘积。对这就是这个视图在屏幕是的真实位置,确切的讲是这个View.origin在屏幕上的确切位置,因为严谨的说一张图片或一个矩形在屏幕上是由4个点组成的一个面。

注意:
频繁的交替设置transform与调用matrix/finalMatrix会带来不必要的性能消耗,langou的渲染逻辑是在渲染画面前不对任何视图属性设置做额外的计算只做存储并该标记属性的改变,等待准备渲染前才做统一的计算。当一个视图的transform改变时如果这时你要获取matrixfinalMatrix那么直接返回matrixfinalMatrix那一定是不正确的,幸好系统会做检测当发生了改变你要强取些值会提前对这些值做运算,返回一个正确的值给你,但如果你频繁的设置与获取,那就会频繁的做些运算。并且这只仅限于非布局视图,在布局视图上这样做并不会返回正确的值参见Trap in Layout

布局视图

布局视图按可放置内容划分有三类:

Div

从API文档上看见Div只有一个属性contentAlign, 那么这里重点讲述就是这个属性,因为它是与浏览器完全不相同有的地方,至于基础类型Box大家可以参与API文档会有详细说明,注意padding这个属性在langou里是没有的,因为这个导致系统复杂性上升,但以后要不要加待定。

langouDiv并没有自己单独的浮动方式这个属性。但Div能设置它的contentAlign对它的内容对齐方式做出更改,这个属性可选的值有4个,默认为left左对齐

  • left
  • right
  • top
  • bottom

这其实很好理解 :

  • leftright为水平布局,内容对齐方式从左到右或从右到左排列,溢出往下换行。
  • topbottom为垂直布局,内容对齐方式从上到下或从下到上排列,溢出往右换列。

需要注意的是它的内容必须为Box类型否则这个属性并不会对它产生任何的效果,如果它内部出现了SpanTextNode那么SpanTextNode的出现不会对Div的内容布局造成任何影响,因为Div会忽略非Box内容的排版处理,同理一个BoxDiv出现在非排版布局视图内部那它的位置与使用非布局视图没有区别。

Hybrid

Div一样它也只有一个属性textAlign但它可以对任何Layout内容做排版处理这当然也包括SpanTextNode

Div的区别Hybrid的内容方式的不同,Hybrid把它的所有内容都当成文本进行处理。它的可选有6个,默认为left

  • left
  • right
  • center
  • left_reverse
  • right_reverse
  • center_reverse

left right center 很好理解
left_reverse right_reverse center_reverse 是在对齐的基础上将内容颠倒排列,

如:对Langou进行颠倒排版会变成这样

left_reverse center_reverse right_reverse
SJodacovA SJodacovA SJodacovA

Span,TextNode,Text

  • Span并没有显示实体,也就是说它并不会在屏幕上显示任何可见的东西,它的存在只为是为了设置嵌套的TextNode视图属性,因为以TextLayout上的属性都能被它的子TextLayout所继承,这也是langou中唯具有继承性质属性的视图。

  • TextNodeSpan的子类型,但它有实体它也是个叶子视图,也就是它不能再存在子视图。

  • Text继承于HybridTextNode一样也是叶子视图不能存在子视图

Indep

独立的Div,相当于html-css中的绝对定位,它存在于DivHybrid内部时,会进行独立排版,不会影响其它兄弟视图的排版位置。

Limit,IndepLimit

限制的盒子,minWidth, maxWidth,minHeight,maxHeight,这些属性能限制盒子的尺寸,这与html中的限制很相似。

Root

Root一个应用程序只能是唯一的也是必须的

Examples

最后为大家写一段代码实际运行一下

import { 
    GUIApplication: App, Root,
    Div, 
    Indep,
    Hybrid, 
    Span,
    TextNode,
} from 'langou'

new App().start(
    <Root>
        <Div margin=20 width="full" height=100
         backgroundColor="#f00">
            <Indep width=50 height=50 
            backgroundColor="#f0f" 
            alignX="center"
            alignY="center" />
            <Div width=50 height="50" 
            backgroundColor="#00f" />
        </Div>
        <Hybrid margin=20 width="full" height=100 
        backgroundColor="#f00" textColor="#ff0" 
        textBackgroundColor="#00f6">
            Hello 
            <TextNode textColor="#000">
                Langou!
            </TextNode>
        </Hybrid>
        <Hybrid margin=20 width="full" height=100 
        backgroundColor="#f00" 
        textAlign="center_reverse">
            Hello Langou!
        </Hybrid>
    </Root>
)

下面是iphone6的运行效果:

[图片上传失败...(image-b04357-1563121988337)]

下面是Google nexus6的运行效果:

[图片上传失败...(image-222f27-1563121988337)]


就说到这里吧,已经累的不行了,下一篇为大家讲动作系统。

谢谢大家,未完待续~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容