当前位置: BOLT界面引擎 > 知识库文章 > 表达式简介

表达式简介

作者:李亚星

1.         目前位置表达式只支持obj对象,也就是obj和objtemplate的xml定义里面可以使用,objtree、objtreetemplate、hostwndtemplate对象还不可以使用
2.         每个obj的xml配置里面,attr节点下面的left、top、height、width四个属性可以配置表达式,例如:
<obj id="ctrl.caption" class="CaptionObject" >
         <attr>
                   <left>20</left>
                   <top>0</top>
                   <width>father.width</width>
                   <height>10 + 20</height>
                   <caption>0</caption>
                   </attr>
         </obj>
 
上面配置了四个表达式,其中left和top的两个值为单数字的表达式,width的表达式是带引用值的表达式,使用了引用值father.width,height里面是一个纯数字的表达式,也就是值计算出来是一个固定值(等价于30)
 
3.         表达式可以包括以下值
a)        整形数字
b)        运算符号+-*/ ()
c)        引用值
 
引用值由大小写英文字母、数字和符号. _组成,包括
a)        引用的object,可以引用的object包括自己和自己的直接父object,但不包括自己的兄弟object、父object的兄弟object、间接父object等,引用object目前只支持father一个关键字
b)        引用的属性,包括lefttoprightbottomwidthheight六个属性
a)        引用规则,由obj.attr组成,object标识引用的object,如father.width,如果不指明obj,那么引用的obj就是自己,下面是几个例子
                        i.              father.height      父object的宽度
                      ii.              father.right 父object的右边缘
                    iii.              left        自己的左边缘
                     iv.              width    自己的宽度
 
 
 
 
 
 
 
下面是一个例子:
<obj id="king" class="ImageObject">
              <attr>
                     <left>0</left>
                     <top>0</top>
                     <width>father.width</width>
                     <height>father.height</height>
              </attr>
              <children>
                     <obj id="prince" class="ImageObject">
                            <attr>
                                   <left>father.width/2 - 10</left>
                                   <top>father.height/2 - 10</top>
                                   <width>father.width – left </width>
                                   <height>father.height – top</height>
                            </attr>
                     </obj>
              </children>
</obj>
上面的例子中,包含了一个父obj king,king又有一个子obj prince。
 
4.        obj的表达式什么时候会被触发计算?
a)        直接Father的pos改变了,会导致所有的子object重新计算pos表达式(假如pos信息包含表达式),如果该object包含表达式并且有指向父节点的引用值,会导致重新计算表达式。比如例子中的king obj的位置如果发生变化了,会递归的通知子obj,子obj也会递归的计算自己的位置表达式,并更新自己的位置。
b)        Object被显示调用了SetObjPos等函数修改了pos表达式信息,那么这个obj会计算自己的表达式并更新自己的位置,假如还有子obj的话,也会递归的通知子obj
 
5.        Obj以及obj之间的表达式求值顺序是怎样的?
 
a)        Object从父节点到子节点,自顶向下求值。父节点先计算自己的表达式,更新位置信息,保证子object引用的信息是最新的,然后递归调用子object进行求值。比如例子中,假如某种原因导致king的位置表达式求值了,那么king会先算计算表达式来算出自己的新位置,然后通知prince进行计算。
b)        Object内部求值,按照left、top、width、height的顺序,依次计算四个表达式,计算完毕每个表达式,更新对应的位置信息,然后进行下一个表达式的求值,比如prince的表达式计算,会依次计算下面四个表达式
          i.              left:father.width/2 – 10
        ii.              top:father.height/2 – 10
      iii.              width:father.width – left
       iv.              height:father.height – top
 
 
6.        表达式计算时候,引用值是新值(此次递归求值过程中刚刚被更新的值)还是老值(此次递归求值过程中还没有来得及更新的值)
 
a)        如果是由于father导致的递归求值,对于上一级的引用值,引用的是新值。
比如例子中,假设在一轮新的递归求值过程中,king表达式计算完毕了,得到的值如下
left = 0 top = 0 width = 100 height = 100 right = 100 bottom = 100
那么prince开始计算时候,引用到的father.attr都是king目前的新的值,比如father.width应该是100,father.height应该是100。
b)        Object内部,按照let、top、width(right)和height(bottom)求值顺序,引用求值顺序在自己前面的,引用的则是新值;引用自己或者求值顺序在自己后面的,引用的则是旧值。比如width表达式计算时候,引用到了left,那么由于left表达式计算先于自己计算,则引用到的是新值;假如引用到了right,由于right表达式的计算顺序后于自己计算,那么引用到的则是旧值。
比如例子中,假设prince的表达式开始计算,按照5中描述的计算顺序,会依次计算left、top、width、height四个表达式,计算left=100/2-10=40
Top=100/2-10=40,计算width时候,width里面的left引用了自己的left,应该是left的新值40,而不是之前的某个值,所以width=100-40=60,height=100-40=60
 
 

 

迅雷公司 版权所有 Copyright 2003-2010 Thunder Inc.All Rights Reserved. 意见反馈:xl7doc@xunlei.com