Kanzi学习之路(4):Kanzi的属性系统

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010977122/article/details/54866087

由于中间隔了一个年假,所以这两周都没有更新,今天来一起学习一下kanzi的属系统,由于内容太多,本文只讲解一些概念和在kanzi studio中的使用,下一次会分享在kanzi engine中的使用。


从前面的学习中,我们也接触到了kanzi一些节点的属性,比如在Scene下新建一个3D的正方体,我们左键选中这个节点,就会在右边的面板里显示该节点的属性,如下图:

       

有了这些属性的好处就是我们可以通过数值、枚举等将节点的一些特点进行详细的定义,便于描述和修改。


就像是介绍一个人,怎么样我们才能将他介绍清楚呢,很明显,我们要告诉别人他的名字,性别,身高,年龄等等特征,这样就可以很好的让别人来了解这个人,这些东西是每个人都会有的,所有称为人的共有“属性”。但是,在一些特殊的场合,可能会需要一些特别的属性,比如,如果他是一名老师,别人可能想知道他的职称是什么呀,但是职称并不是所有人都有的呀,这个就是老师的特有的“属性”。为了便于交流沟通,我们会预先为一类事物定义一些属性,这些属性是这一类事物所共有的,比如上述人的姓名,性别等,老师的职称等,但是,某些特殊的场合,我们又需要一些特殊的“属性”才能更好的把事物描述清楚,比如某个人放假了,放了几天呀,这个一般在描述他人的时候不问提到,所有就没有进行预定义,那怎么办,也分一类人嘛?如果别人想问假期有多少天?上了几年学,几年级等等呢?这个时候我们发现为了一些特殊场合才用到的“属性”专门分一类人是不合理的,因为我们无法预料的专门详细。那怎么办,我们就提供一种方法可以给事物在定义属性的权利不就ok了嘛,这样的话,就可以根据场合和需求的不同,自己定义一些特殊的“属性”。那么又有人会问了,既然能够自定义“属性”,我们干嘛还去预制一些属性呢?这个一是为了复用,比如,你是个媒婆,给人家姑娘介绍一个老师,想了一遍要描述他哪些方面,哪些特点,结果姑娘听了不满意,你又给她介绍另外一个,巧了,还是老师,难道你还要再去想一遍要怎么介绍了,这样是不是太麻烦了,完全可以把老师基本的信息介绍一遍,其他的就是他特有的一些自定义的“属性”了,这样是不是事半功倍呀。二是便于统一,便于管理。同是姓名,有人可能说是名字,有人说是姓名,有人说是称号,大名啥的,是不是很乱呀,简单和别人介绍也就算了,但是如果想把这些信息记录管理,是不是太麻烦了。解决了描述事物的属性的问题了,但是还有一个问题,比如,给一群来相亲的人每人发了一份表格填一下他们的个人信息,结果就姓名这一项就填的乱七八糟。有人用简体中文写,有人用繁体写,还有一些特立独行的非要用英文来写,谁叫人家起了个英文名字呢,还有一些装b的,没英文名字,非要用拼音来写。。。所以就姓名这一项,我们就要规定一下,都要用简体中文,但是如果在国外呢,可能就不一样了,就要求英文名字了。年龄的话,也要规定一下,大于0小于150的整数,而且要是数字。做的这些规定限制是什么呢,这个就是“属性类型”,用于量化指定属性。有了属性和属性类型,我们可以方便的描述事物了,但是在某些情况下,事物的属性可能发生了改变,比如,你给领导送礼了,领导拿人手短,就提拔你了,那你的职位就要改变了,这个时候,人事同志就要在公司人力档案上去修改你的职位,如何去修改呢,就要根据你的姓名,找到你的记录,修改你的属性(其实这就和我们使用kanzi engine来修改某个节点的属性是一样的)。闲扯了这一段,基本概括了今天的内容,kanzi的属性系统用来干嘛的,如何在kanzi engine中查找想要的节点并修改其指定属性,还有如何自定义属性。接下来,我们来详细看看。


属性系统

属性系统为指定和检查节点的状态、外观和行为提供了方法。比如,一个属性可以定义节点的颜色,表示一个按键是否被按下,或者指定一个节点的对齐方式等。尽管你不了解属性系统是如何工作的,但是你只要在kanzi studio设置了属性,你就可以在代码中去获取修改使用这个属性。但是,为了充分利用属性系统的一些特性,你还是要去熟悉属性系统是如何工作的。属性系统为访问kanzi节点的数据提供了统一的方式,因此,很多kanzi的子系统可以去操作这些数据。比如,你可以让一个属性值做一个动画改变,提供属性中间的绑定,监控属性值的改变。任何属性值都可以被多个输入源影响改变。属性系统定义了如何去如何解决受所以输入影响之后的属性值和如何解决当前的属性值的规则。比如,你可以直接去指定一个属性的值,但是一些属性可能有默认的值,风格也可能会影响属性的值,它们可能还会被动画和状态管理机制修改。通过提供自动应用的规则,最最大的减少了用户必须手动修改属性的地方。


扫描二维码关注公众号,回复: 4959743 查看本文章

属性使用

Kanzi里大多数属性定义在使用它们的类中。这些属性在定义的地方来配置事物的外观、状态和行为。比如,Text Block节点力的Text属性定义了节点绘制的文本,Visible属性定义节点和它派生节点的可见性。

但是,有一些Kanzi 属性用来配置其他节点的外观、状态和行为。比如,在materials定义Diffuse Color属性可以改变使用该material节点的外观,在Grid Layout里定义Row和Column属性,它们并不用来设置Grid Layout节点自己,而是分配Grid Layout下的子节点。


属性类型

每一个属性都有一个描述的属性类型。在属性使用中,它的属性类型是唯一的,属性的名字和属性值的类型都有该属性来保存。这个属性类型也就定义了该属性值的类型。比如,Node.Visible这个属性用于Node这个类和它的衍生类中。你就可以通过属性名字(Node.Visible)在运行时去查找属性类型。因为这个属性类型是布尔类型的,它只接收true和false。那么接下来,我们来看看kanzi支持的属性类型有哪些:

Boolean stores values  True or  False and has no type-specific properties. Color stores color information for red, green, blue, and alpha channels (RGBA).
Note that even though in  Kanzi Studio you can set color values for hue, saturation, light, and alpha channels (HSLA),  Kanzi stores them in RGBA. This means you can animate only RGBA values. Enumeration stores a set of key value pairs, so that each unique key resolves to a unique integer. Float stores single precision floating point values. Integer stores 32-bit signed integer values. Matrix 3x3 stores 3x3 matrices of floating point numbers, which you can use to store transformations for 2D nodes. Matrix 4x4 stores 4x4 matrices of floating point numbers, which you can use to store transformations for 3D nodes. Message represents messages, which you can use to add message triggers for application event messages.  Project Item stores references to objects and does not have type-specific properties. You can use Project item data type only in application code, for which  Kanzi converted the property into the path of the target in a string format. Property Type stores references to other property types. You can use Property type data types only in application code, for which  Kanzi converts the property into the name of the target in a string format. Text stores plain text and does not have type-specific properties. Vector 2D stores vectors of two floating point numbers. Vector 3D stores vectors of three floating point numbers. Vector 4D stores vectors of four floating point numbers.

注意,在kanzi studio中可能有更多专业的属性类型,但是它们都来源于上述列举的数据类型。比如,枚举变量就是代表限制了范围的整形而已。


默认属性值

每个属性都定义它的默认属性值。如果没有直接或者间接指定(通过风格,继承等等)属性值的话,当被查找的时候,kanzi会返回属性的默认值。比如尽管Node.Visible属性没有在每个节点中指定为true,但是这个属性值默认就是true。所以当被查询的时候,所以节点默认都是可见的。

在开发App的时候,使用默认属性而不用去指定数值,可以节约很多时间。此外,有一些属性的属性值没有是有条件的。比如,Node.Width和Node.Height属性使用户控制特定节点的大小,但是可以通过设置Width和Height属性为100像素,你就使得控制的大小为100*100像素大小。如果没有设置属性值的话,有些属性可以自己决定自己的大小。比如,Image可以基于显示图片的大小来决定自己的大小,或者Stack Layout节点可以定义它管理所有节点的大小。


属性优先级

当系统去查询一个属性时候,会得到一个结果,但是属性系统如何去评估多个影响源来确定最终属性值的方法影响了属性值。这些影响源的评估是按照一个特定的顺序来的。kanzi engine基于以下优先级来决定运行时候的属性值(开始的最高):

动画和状态管理系统。动画会动态修改属性值,状态机制会更具状态不同重写属性值。 本地值。本地值是你直接设置的属性值。在  Kanzi Studio 节点所有的属性都通过本地值来定义的。你可以通过使用 actions, bindings,  Kanzi Engine API, and scripting来进行指定。 如果使用 Kanzi Engine API ,你可以通过 setProperty()方法来设置本地值。比如设置节点的Visible属性为false, node.setProperty(Node::VisibleProperty,false)。不过大多数 类提供的辅助函数来获取这些属性。比如,你可以通过 node.setVisible()函数来设置 Node.Visible  属性。 Named 风格.  Kanzi applies a named style to all nodes whose  Style property value points to that style. Typed 风格.  Kanzi applies a typed style to all nodes of the type you specify in the style.  继承的值(如果属性是可继承的)。每个属性都指定了它是否可继承的。但是只有特定的值可以从父类继承。比如, Node.Font 就是一个可继承的属性。如果你想所有文本都使用一样的字体, 你只要在你的scene graph最顶层指定  Font 属性为某一特定字体类型,那么kanzi就会对后代所有节点使用这同一种字体类型。 元数据属性类型的默认值。如果没有其它的影响,所有的属性都有 它的默认值。但是每个继承属性类型的类都可能会重写它的默认值。比如,  Node.HorizontalAlignment 和  Node.VerticalAlignment 属性的默认值是  HorizontalAlignmentCenter 和  VerticalAlignmentCenter。但是  Node2D 重写了这两个属性默认值为 HorizontalAlignmentLeftVerticalAlignmentTop


自定义属性

现在先来看一下如何在kanzi studio中自定义属性。在Library导航条下,在Property Types上右击,选择Create->Property Type,然后就会出现如下图:


Naming分组中:

Name 去设置属性在kanzi api中使用的名称。注意,该名称中不能包含空格。 Display Name 去设置属性在kanzi studio中使用的名称。输入  <Name> 会使用和   Name  属性一样的名称。 Category 去设置你的属性在   Properties  和  Add Properties  窗口所在的分组。使用该属性可以帮助你在kanzi studio中快速的找到你的属性。

Type分组中:设置你自定义的属性所代表数据的类型,可以使用上面提到的属性类型。

Type Specific分组中:你可以设置你自定义属性的最大值和最小值。如果你使用滑条来表示属性值,你可以设置滑条的步进值。

Value分组中:你可以设置自定义属性的默认值和sorting index。

最后点击Save,你就可以像添加其他属性一样来添加它了,如下图,我自定义了一个testtype属性:



下节就主要看看如何通过Kaniz engine去查找相应节点,修改属性,绑定属性等。

猜你喜欢

转载自blog.csdn.net/u010977122/article/details/54866087