EUI库 - EXML

  EXML是可以运行时加载解析的
  <e:Skin class="skins.ButtonSkin" states="up,down,disabled" minHeight="50" minWidth="100" xmlns:e="http://ns.egret.com/eui">

<e:Image width="100%" height="100%" scale9Grid="1,3,8,8" alpha.disabled="0.5"source="button_up_png"source.down="button_down_png"/>

<e:Label id="labelDisplay" top="8" bottom="8" left="8" right="8"size="20" fontFamily="Tahoma ‘Microsoft Yahei‘"verticalAlign="middle" textAlign="center" text="按钮" andtextColor="0x000000"/>

<e:Image id="iconDisplay" horizontalCenter="0" verticalCenter="0"/>

</e:Skin>

描述了一个按钮的皮肤class 是 skins.ButtonSkin

alpha.disabled = 0.5source.downtextAlign left center right (和horizontalAlign的布局值一样)

直接引用Exml文件 假设 exml的要节点是 Skin这时可以直接这样var button = new eui.Button();button.skinName = "resource/skins/ButtonSkin.exml"this.addChild( button ) ;
动态加载Exml文件 如果 exml的根节点不是 SkinEXML.load( "skins/ButonSkin.exml", this.onLoaded, this ) ;private onLoaded( clazz:any, url:string ):void{   var button = new eui.Button();   button.skinName = clazz ;   this.addChild( button ) ;}
嵌入EXML到代码 var className = "skins.ButtonSkin";var exmlText = `<e:Skin class="${className}" states="up,over,down,disabled" xmlns:s="http://ns.egret.com/eui"> ...</e:Skin>`;var button = new eui.Button();   button.skinName = exmlText  ;   this.addChild( button ) ;

或者先用HttpRequest去加载然后用EXML.parse( exmlText ) 去解析,直接可以返回类定义

  <e:Group class="app.MyGroup" xmlns:e="http://ns.egret.com/eui">

</e:Group>

和下面代码含义一样:module app {

export class MyGroup extends eui.Group {

public constructor(){super();}}}

注意一定要加 class

最基本的图片 <e:Image source="image/button_up.png" x="10"/><e:Image source="image/button_up.png" x="10"> <e:scale9Grid> <e:Rectangle x="10" y="10" width="45" height="35"/> </e:scale9Grid>
id属性
这个id属性与HTML中的id并不是一回事,它的结果相当于给解析后的类声明了一个公开变量

我们可以在节点上声明一个id属性,注意这个id属性与HTML中的id并不是一回事,它的结果相当于给解析后的类声明了一个公开变量。例如:

- <e:Group class="app.MyGroup" xmlns:e="http://ns.egret.com/eui">

<e:Image id="iconDisplay" />

</e:Group>

等价于:

- module app {

- export class MyGroup extends eui.Group {

- public iconDisplay:eui.Image;

- public constructor(){- super();- var image = new eui.Image();- this.addChild(image);- this.iconDisplay = image;- }- }- }

语法糖
<e:Image source="image/button_up.png" x="10" scale9Grid="10,10,45,35" />

<e:Image source="image/button_up.png" width=“100%” height="100%" />等价于:var image = eui.Image();image.source = "image/button_up.png";image.percentWidth = 100;image.percentHeight = 100;

节点默认属性我们已经知道了复杂属性节点的声明方式,要先显式声明一个属性名称的节点,内部再跟上要赋值的节点。这里还有一个类似语法糖的写法,eui库内的组件,通常都会有一个默认属性,如果子节点是赋值给父节点的默认属性,那么可以省略属性名节点。我们来看一个例子:

<e:Scrollerclass="app.MyScroller"xmlns:e="http://ns.egret.com/eui">

<e:viewport>

<e:Group/>

</e:viewport>

</e:Scroller>

这个例子中,我们将Group实例赋值给了一个滚动容器Scroller的viewport属性。由于viewport是Scroller的默认属性,因此我们可以直接省略<e:viewport>节点,改成如下写法:

<e:Scrollerclass="app.MyScroller"xmlns:e="http://ns.egret.com/eui">

<e:Group/>

</e:Scroller>

默认属性除了支持省略属性名节点外,若默认属性的类型是一个数组,还可以省略Array节点。其实添加子项也只是省略默认属性的一种特例,因为容器的默认属性是elementsContent,类型正是数组。最开始添加子项的那个例子完整写法如下:

<e:Groupclass="app.MyGroup"xmlns:e="http://ns.egret.com/eui">

<e:elementsContent>

<e:Array>

<e:Image/>

</e:Array>

</e:elementsContent>

</e:Group>

当然,我们直接用最简洁的省略默认属性写法即可。

内部类 除了皮肤,ItemRenderer也是一个典型的使用率很高且不复用的组件。我们现在也可以直接内嵌ItemRender的皮肤到List节点中:
视图状态
也算是语法糖的一种

在根节点上,我们声明了视图状态名称列表 states="up,over,down,disabled",它表示这个皮肤具有up,over,down,disabled这四种状态,当皮肤的currentState属性被逻辑组件设置为这四个状态之一时

1.添加移除对象, includeIn之外,还有一个excludeFrom

2.设置属性。 textColor.down="0x009aff"

时间: 2024-11-08 21:33:10

EUI库 - EXML的相关文章

EUI库 - 皮肤

皮肤分离机制    皮肤分离机制对制作可复用的外观比较有优势 那对于只使用一次的皮肤呢?如果也拆分出两个文件,显然不太方便.这里我们针对单次使用的皮肤定制了内部类的功能   每个组件都有一个childrenCreated()方法,它会在组件初始化完成后回调,子类通常覆盖这个方法来访问一些延迟实例化的子项. 皮肤部件 在皮肤附加到逻辑组件上时,会自动匹配双方的同名变量和id,这些同名变量就叫做"皮肤部件"(SkinPart)   .当为某个组件定制皮肤时,实际上就分为创建对应的皮肤部件和

EUI库 - 概述

  新特性 36k   访问EUI组件宽高时,也会跟原生显示对象的表现一致,立即能得到包含子项的宽高值   统一的显示列表  普通对象和eui对象都可用addChild来添加   一个逻辑组件只管代码控制,一个皮肤组件只负责外观 内部类  <e:Button label="按钮"> <e:Skin states="up,over,down,disable"> <e:Image source="image/button_up.p

EUI库 - 9 - 数据集合 - 列表

List 和DataGroup的区别 1 选中一项 会触发 eui.ItemEvent.ITEM_TAP 事件, 2 有选中项的概念,可以设置 List 里的默认选中项 selectedIndex selectedItem 3 可以开启多选状态 allowMultepleSelection = true ; selectedIndices selecteditems requireSelection 至少要有一个被选中 4 配合Scroller可实现滚动效果

EUI库 - 9 - 数据集合 - 数据容器

DataGroup 设置一个数据源 自动创建内部所需的对象 来完成数据展示   还要设置单条数据的模板  叫ItemRenderer 继承关系 eui.List  eui.ListBase eui.DataGroup eui.Group 创建ItemRenderer 继承 eui.ItemRenderer 然后在内部添加自定义的功能 dataGroup.itemRenderer = LabelRenderer  策略1 useVirtualLayout  = false 有多少条数据就创建多少个

EUI库 - 9 - 数据集合 - 数组集合

ArrayCollection  当数组内的数据被修改了(增删改),组件能有效的获知 myCollection.addEventListener(eui.CollectionEvent.COLLECTION_CHANGE,this.collectionChangeHandler,this); 长度 ArrayCollection.length 增 addItem() addItemAt() 删 removeItemAt() removeAll(); 改 replaceItemAt( {}, 3

EUI库 - 容器

eui.UILayer UILayer是Group的子类它只有一个功能,到放到场景上后,宽高永远和场景宽度一致   Group Group 是自动布局的容器基类.如果包含的子项内容太大需要滚动显示,可以在在 Group 外部包裹一层 Scroller 组件(将 Group 实例赋值给 Scroller 组件的 viewport 属性).Scroller 会为 Group 添加滚动的触摸操作功能,并显示垂直或水平的滚动条. 做过试验了 操作内部对象的方法 和Sprite基本一致,只是多了getEl

EUI库 - 自动布局

自适应流式布局 width="100%" top left right horizontalCenter=0 失效验证机制 这些异步过程都封装好了,我们只需要关注那一对方法: invalidateProperties() 和 commitProperties() ,前者标记属性失效,后者应用失效的属性   一个是测量验证   invalidateSize() 和 measure() 一个是布局验证. invalidateDisplayList() 和 updateDisplayList

EUI库 - 快速入口之项目配置

egretProperties.json exmlRoot  指定exml文件存放根目录,该路径必须为相对路径,目录内只能有exml文件 themes    主题文件数组,配置所有主题文件路径,该路径必须为相对路径(什么是主题?) exmlPublishPolicy 发布时主题文件存储exml策略,可能的值有 path,content,gjs (这三个值我也不懂) path :主题文件只存储路径,会去加载不同exml文件,和debug时一致,不推荐使用 content :主题文件存储exml内容

EUI库 - 10 - 使用自定义组件

步骤 1 在根节点,添加一个自定义的命名空间 2 可以设置skinName 自定义组件规范 1 不复用的不要用自定义组件 2 属性必须要有默认值(赋值为null也可以),因为TS编译器会把没有默认值的属性直接优化掉,在运行时并不存在. 3.属性的getter方法内要判断访问的对象是否为空,确保外部任何情况下访问属性都不会报错. 4 组件构造函数参数必须为空,或者参数有默认值,否则无法用空构造函数实例化. 5.组件的构造函数内不应该有对外部业务逻辑依赖的代码,这部分代码可以转移到组件被添加到舞台的