AvocadoJS视图与布局系统

视图View

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

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

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

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

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

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

非布局视图

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

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

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

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

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

  • x
  • y
  • scale_x
  • scale_y
  • rotate_z
  • skew_x
  • skew_y

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

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

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

布局视图

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

Div

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

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

  • left
  • right
  • top
  • bottom

这其实很好理解 :

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

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

Hybrid

Div一样它也只有一个属性text_align但它可以对任何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 是在对齐的基础上将内容颠倒排列,

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

left_reverse center_reverse right_reverse
SJodacovA SJodacovA SJodacovA

Span,TextNode,Text

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

Indep

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

Limit,IndepLimit

限制的盒子,min_width, max_width,min_height,max_height,这些属性能限制盒子的尺寸,这与html中的限制很相似。

Root

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

Examples

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

import { 
    GUIApplication: App, Root,
    Div, 
    Indep,
    Hybrid, 
    Span,
    TextNode,
} from ‘:gui‘

new App().start(
    <Root>
        <Div margin=20 width="full" height=100
         background_color="#f00">
            <Indep width=50 height=50 
            background_color="#f0f" 
            align_x="center"
            align_y="center" />
            <Div width=50 height="50" 
            background_color="#00f" />
        </Div>
        <Hybrid margin=20 width="full" height=100 
        background_color="#f00" text_color="#ff0" 
        text_background_color="#00f6">
            Hello 
            <TextNode text_color="#000">
                AvocadoJS!
            </TextNode>
        </Hybrid>
        <Hybrid margin=20 width="full" height=100 
        background_color="#f00" 
        text_align="center_reverse">
            Hello AvocadoJS!
        </Hybrid>
    </Root>
)

下面是iphone6的运行效果:

下面是`iphone6`的运行效果

下面是Google nexus6的运行效果:

下面是`Google nexus6`的运行效果



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

谢谢大家,未完待续~

时间: 2024-08-24 08:38:17

AvocadoJS视图与布局系统的相关文章

ASP.NET MVC3 系列教程 – 新的Layout布局系统

原文地址:http://www.cnblogs.com/highend/archive/2011/04/18/asp_net_mvc3_layout.html I:回忆MVC2当中MasterPage那些事 code: <!------------Begin--------------> <!-- Master文件 --> <%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPa

【翻译】探究Ext JS 5和Sencha Touch的布局系统

原文:Exploring the Layout System in Ext JS 5 and Sencha Touch 布局系统是Sencha框架中最强大和最有特色的一个部分. 布局要处理应用程序中每一个组件的尺寸和位置.在Ext JS和Sencha Touch直接有很多相似之处.尤其是如今Ext JS 5開始支持平板更是如此.以下让我们来探讨一下布局系统是怎样跨域Sencha框架进行工作的. 布局简史 最主要的HTML一直都缺乏一个严格定义的布局系统. 很多年来,因为CSS实现的差距.开发跨浏

html万能排版布局插件,web视图定位布局创意技术演示页

html万能排版布局插件,是不是感觉很强大,原理其实很简单,不过功能很强大哈哈,大量节省排版布局时间啊! test.html <!doctype html> <html> <head> <meta charset="utf-8"> <title>web视图定位布局创意技术演示页</title> <meta content="width=device-width,initial-scale=1.0,m

【转】Bootstrap 框架 栅格布局系统底层设计原理

如果你是初次接触Bootstrap,你一定会为它的栅格布局感到敬佩.事实上,这个布局系统提供了一套响应式的布局解决方案. 既然这么好用,那他是如何用CSS来实现的呢? 我特意去Bootstrap官方下载了源代码进行分析了一番,看完之后果然有了收获,不过我只看了栅格布局的那块代码,其实也很简单,不必担心不懂,你只需要要基础的CSS知识即可. 前提条件(Bootstrap 自带) 首先使用这个布局之前要定义一下代码: 这行代码如果不懂,可以搜索一下,总之大致意思就是,被定义的元素的内边距和边框不再会

视图——机房收费系统

1.什么是视图? 在第一次做机房收费系统时,学生信息和卡的信息是在同一张表中的,而机房收费系统重构时,对数据库进行了重新设计,学生信息和卡的信息被分到了单独的两张表中(遵照三范式设计,减少数据冗余),当我们需要同时查询这两张表中的信息时,按照一般的方法从每张表中单独查询的话会非常麻烦且容易出错,为了减少出错,我们可以把要查询的信息整合到一张虚拟表中,这张虚拟表就是视图. 视图就如同一张表一样,对表能够进行的一般操作(增删改查)都可以应用于视图,一个视图是由SELECT语句组成的查询定义的虚拟表,

第6章—渲染web视图—使用Apache Tiles视图定义布局

使用Apache Tiles视图定义布局 Tiles是一个免费的开源模板Java应用程序的框架.基于复合模式简化的用户界面的构建.对于复杂的网站仍是最简单.最优雅的方式与任何MVC技术一起工作.Struts2对Tiles提供了支持,如今Tiles发展已有13个年头,成为Apache的一个独立项目,我们可以单独使用Tiles来构建用户界面布局. Tiles项目:http://tiles.apache.org/index.html Tiles的配置DTD定义:http://tiles.apache.

布局系统

目标局: 选择思维 间谍思维 情报思维 通灵思维 方向局(定战略--搭框架--填充策略,方法,工具,细节/优化  警惕:方向不对,努力白费) 预测思维 投影思维 摆局(设局) 布局思维 预制前提(人,事,物,环境,换位--时间,维度,角度) 换位思维 布局方案 风控体系 防火墙思维 风控思维 做生意要追求"一万",更要防止“万一”,因为一个“万一”,就会让你多年的心血付之一炬. 定局 选择思维 执行思维 行局:选择摆局方案 ---备选!! 前行局:开局 ---万事开头难,局设计的再好,

九宫格视图的布局及展示(相册选择)

上周一个朋友带的项目出了点问题,招的ios开发人员在实现选取相册图片后用九宫格的样式展示时遇到了瓶颈,花了将近2周都没有解决.后来在跟我交流的过程中他把项目的图片发给我看了下,看完我就笑了,这就只是个算法的问题,花点时间思考下基本就能解决的.废话不多说,把之前完成的效果展示出来. 以上是直接用手机截的图,传上来没想到会这么大.其中图片添加的功能是引入了一个第三方的库,非常好用,跟qq上的图片添加功能几乎没两样,库的名字是ZLPhotoActionSheet.当然这都不是重点,重点是怎样去实现九宫

django restframework视图、路由系统和渲染器

视图 使用混合(mixins) 有多张表,多个类,这些类的代码除了从数据库的数据和相应的序列化类不一样,其他都一样,可以做第一步封装.原先做的封装成函数,然后调用函数,但是这里是利用类的继承,这是一种可以借鉴的方式.把逻辑部分封装成父类,代码不同的地方做配置即可.为了满足做一下配置就完成功能,这里使用了generics.GenericAPIView class UserView(mixins.ListModelMixin, mixins.CreateModelMixin, generics.Ge