Kanzi的学习(1):kanzi里的常用的一些控件:
1、内容控制管理节点:
- Image. 使用Image节点可以显示一个位图图像;
- Model. 使用 Model 节点显示导入kanzi应用的模型;
- Nine Patch Image. 使用 Nine Patch Image 节点创建一个可缩放的按钮背景,该背景可根据九个补丁图像内容的大小进行缩放。
- Page. 使用Page 节点组织应用的结构。 例如,如果你的应用中包含多个视图或者模块,如音乐播放模块,相册模块,日历模块,那就为每个模块创建一个Page节点,使用 Page 节点创建每个视图。
- Text Block 3D 和 Text Block 2D. 使用Text Block 节点显示应用里的文本;
- Viewport 2D. 使用Viewport 节点设置投影的目标面的大小。
2、交互性控制节点
- Button 3D 和 Button 2D. 使用 Button 节点创建点击的交互。
- Scroll View 3D 和 Scroll View 2D. 使用 Scroll View 节点为用户创建一个屏幕从划动输入。
- Slider 3D 和 Slider 2D. 使用 Slider 节点可以为用户想在最大值和最小值之间修改数值提供一个可视化的方式。
- Toggle Button 3D 和 Toggle Button 2D.使用 Toggle Button 节点通过有各种触发状态的按钮创建交互。
- Toggle Button Group 3D and Toggle Button Group 2D.使用 Toggle Button Group 节点允许用户从一系列互相排斥的选择中选择一个选项。
3、布局控制节点
- Dock Layout.使用 Dock Layout 节点沿着a Dock Layout 节点边缘布置相互关联的节点。
- Empty Node. 使用 Empty Node 节点用来组织一系列节点,并且可以设置它们的属性值。
- Flow Layout.使用 Flow Layout 节点沿着一条线布置各个节点。当排着超过了边界,会在一条新的线上继续排放子节点。
- Grid Layout. 使用 Grid Layout 节点在一个表格里布置各节点。
- Stack Layout.使用 Stack Layout 节点在一条指定的轴上,布置各个节点。
- Trajectory Layout.使用 Trajectory Layout 节点沿着一条轨迹布置节点。容器控制节点
- Grid List Box.使用 Grid List Box 节点按照网格布局创建可滚动的列表项目。
- Trajectory List Box 3D.使用 Trajectory List Box 3D 节点可以沿着一个轨迹创建可滚动的列表项目。
4、3D 节点
- Camera. 使用 Camera 去显示应用中 Scene 下的节点。
- Instantiator.使用Instantiator 节点去复制一个3D节点或者 Instantiator 节点目标节点树的外观。
- Level of Detail.使用 Level of Detail“详细等级”节点,用于根据“详细等级”节点的查看距离显示同一对象或不同对象的不同外观。
- Light 节点. 使用 light 节点为应用中的Scene创建光照资源。Kanzi 有以下光照节点类型:
- Directional Light (平行光)只发射一个方向的光,适合用来模拟太阳光;
- Point Light(点光源) 从一个指定地方,朝360度发射光线;
- Spot Light (聚光灯)从一个指定的方向想另外一个指定的方向,以一个锥型发射光线。
- Scene. 使用 Scene 节点在应用中显示3D内容。
Kanzi学习(2):Kanzi的属性系统
Properties(特性,属性):以Box3D为例
属性类型
- Boolean:布尔值存储True或False值,并且没有特定于类型的属性。
- Color:颜色存储红色、绿色、蓝色和alpha通道(RGBA)的颜色信息。
- 请注意,即使在Kanzi Studio中,您可以为色调、饱和度、灯光和alpha通道(HSLA)设置颜色值,Kanzi也会将它们存储在RGBA中。这意味着您只能设置RGBA值的动画。
- Enumeration:枚举存储一组键值对,以便每个唯一的键解析为唯一的整数。
- Float:浮点存储单精度浮点值。
- Integer:整数存储32位有符号整数值。
- Matrix 3x3:矩阵3x3存储浮点数的3x3矩阵,可用于存储二维节点的变换。
- Matrix 4x4:矩阵4x4存储浮点数的4x4矩阵,可用于存储三维节点的变换。
- Message表示消息,可用于为应用程序事件消息添加消息触发器。
- Project Item:项目项存储对对象的引用,并且不具有特定于类型的属性。只能在应用程序代码中使用项目项数据类型,Kanzi将该属性转换为字符串格式的目标路径。
- Property Type:属性类型存储对其他属性类型的引用。只能在应用程序代码中使用属性类型数据类型,对于应用程序代码,Kanzi将属性转换为字符串格式的目标名称。
- Text:文本存储纯文本,不具有特定于类型的属性。
- Vector 2D:存储两个浮点数的向量。
- Vector 3D:存储三个浮点数的向量。
- Vector 4D:存储四个浮点数的向量。
自定义属性
在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属性:
Kanzi学习(3):使用API修改节点属性
前一节介绍了属性系统,但是我们只是仅仅通过kanzi studio来修改其属性,今天我们来看看如何使用API来修改节点属性。
想要通过API修改节点属性,就要分两步走,一找到节点,二修改属性。今天内容也分这两部分。
获取节点:获取节点有两种方法,一是使用相对路径,二是使用alias。
一、使用相对路径
使用相对路径较容易,从一个你已知的节点,设置相对路径,就可以找到目标节点,如下:
TextBlock2DSharedPtr textblock = getScreen()->lookupNode<TextBlock2D>("/RootPage/Viewport 2D/Text 2D")
二、使用alias
Alias使用范围比较广,它不仅可以在kanzi studio中帮助我们获取一个节点,在kanzi engine 和脚本里也都适用。而且它可以克服使用相对路径的弊端,比如,你已经根据UI设计师提供的.kzb文件开发好了App,下次突然他们修改了某个节点的相对位置,oh,悲剧了,你又要去修改你的代码,这样就很麻烦,但是使用alias的话,就算相对位置发生了改变,你依然可以索引到它。但是使用之前我们都要将alias添加到想要索引的节点的资源字典上(resource dictionary)。下面我们来看看alias的使用先。
当你为一个节点创建一个alias,kanzi studio 会把它添加到最近有资源字典的节点。比如,Scene节点有一个资源字典,而且它有一个Text Block 2D节点,当你直接为Camera创建一个alias,kanzi studio就会把指向Text Block 2D节点的alias自动加到Scene节点的资源字典,具体步骤如下:
1、在kanzi studio 中,在Scene节点上按住ALT键,然后右击,选择Resource Dictionary。我们在windows菜单栏选择Context Resources,就会弹出Context Resources窗口。
2、在Text Block 2D节点上按下ALT并右击选择Alias,命名为Text 2D。这个时候我们点击Screen,就可以在Context Resources窗口看到我们刚刚添加的alias了。
这样我们就可以在kanzi engine中使用如下API获取该节点:
TextBlock2DSharedPtr textblock = getScreen()->lookupNode<TextBlock2D>("#Text 2D")
三、修改属性
属性系统前面我们已经了解过了,修改属性也有两种方法,一是使用setProperty(),二是使用提供的一些辅助函数。
一、setProperty()。
1、使用kanzi::Object::setProperty(const PropertyType<DataType>& propertyType, typename PropertyType<DataType>::DataType value)函数,kanzi里所有节点都继承自Object,所有它们都可以通过该方法设定节点的属性值,我们要传入一个属性类型和一个属性的值。这个属性既可以是系统定义的,也可以是你自定义的。
textBlock->setProperty(TextBlock2D::WidthProperty,20.3)
float fWidth = textBlock->getProperty(TextBlock2D::WidthProperty);
对于自定义的属性,我们要根据属性的类型,使用kanzi engine API定义相应节点的类型,然后使用setProperty修改属性,具体如下:
DynamicPropertyType<float> test("testtype");
textBlock->setProperty(test,20.3);
float fWidth = textBlock->getProperty(test);
二、使用辅助函数修改属性。
kanzi针对一些常用的节点属性会提供修改获取的辅助方法,如setWidth()、getWidth()等,如下:
textBlock->setText("Hello world!");
Kanzi学习(4):属性绑定
在设计中我们会经常遇到要让节点的属性跟随其他节点属性的值一起变化,这个时候我们可以使用kanzi里的绑定实现。
通过绑定,我们可以实现根据其他节点的属性和属性分量来刷新一个节点的属性和属性分量。绑定能够让在其他节点属性改变或者外部事件发生的情况下,自动更新属性的值。
最简单的绑定就是将一个节点的属性绑定到一个常量或者它自己的一个属性,复杂些的比如将一个节点的属性和属性分量绑定到几个其他不同节点。在kanzi studio中,可以在节点的属性窗口里Bingdings属性下添加绑定,而且,kanzi studio会用蓝色标注有绑定的属性,如下图:
当创建绑定时要注意以下几点:
1、只有绑定到相似的数据类型才是有效的。比如,你只能将颜色属性绑定颜色属性上,是二维向量的属性绑定到二维向量的属性上等。
2、绑定只会算绑定表达式的最终值,不论是一元、二元操作,还是一个固定值或者变量。
3、在绑定中,四种基本类型(integer,float,boolean和string)是都可以相互转换。在integer,float,boolean这三种类型之间转换,会根据属性的类型隐式转换的。但无论是转到string类型,还是从string类型转到其他,都是要指明的。
下面我们重点来看看属性绑定表达式的使用,我们首先来看看它的语法:
1、注释
语法:#(comments)
#后面可以跟着我们的注释。如下:
#后面就可以跟着注释
#计算A的值
A = (4 + 5)
- 基本加减乘除、赋值:
A=4
B=2
#Return 6
A + B
#Reurn 2
A - B
#Return 8
A * B
#Return 2
A / B
3、类型转换:
1)转换成整形
语法:INT(value)
2)转换成浮点类型
语法:FLOAT(value)
3)转换成布尔类型
语法:BOOL(valued)
4)转换成字符串类型
语法:STRING(value)
4、内置函数:
1)绝对值
语法:ABS(value)
2) 动画
语法:Animation(property,“animationDataResourceID”)
3)计算大于等于的最小的整数
CEIL(value)
4)将值限定到一定范围(MIN(MAX(value,low),high))
语法:CLAMP(low,high,value)
5)计算小于等于的最大整数
语法:FLOOR(value)
6)Linear step(return the same value as CLAMP(0,1,(value-low)/(high-low))
语法:LINEARSTEP(low,high,value)
7)Round(计算最接近的整数)
语法:ROUND(value)
8)指数
语法:POW(n,e)
9)求模
语法:MOD(value1,value2)
10)求平方根
语法:SQRT(n)
11)比较阈值
语法:STEP(threshold,value)
返回值:如果大于等于threshold,返回1,否则返回0.
12)颜色分量
语法:Color4(r,g,b,a)
# Sets the color to white and opaque.
Color4(1, 1, 1, 1)
# Same as above, but with alternative syntax.
Color(1, 1, 1, 1)
# Sets the color to red with 50% transparency.
Color4(1, 0, 0, 0.5)
# Invalid expression, one argument is missing.
Color4(0.1, 1, 0.4)
# Use variables as attributes of the Color4() to assign the
# attribute values of the whole Color property.
#
# Assigns custom properties Red, Green, and Blue to variables
# you use to control the color of an object.
red = {@./Red}
green = {@./Green}
blue = {@./Blue}
color = Color4(0, 0, 0, 1)
# Assigns the red, green, and blue variables to each color channel attribute.
color.ColorR = red
color.ColorG = green
color.ColorB = blue
color
13)转换分量
语法:MatrixSRT(ScaleX,ScaleY,ScaleZ,RotationX,RotationY,RotationZ,TranslationX,TranslationY,TranslationZ)
# Scales the object on the x, y, and z axes to 1 unit,
# rotates it around the x axis by 30 degrees
# and moves it on the z axis by 2 units.
MatrixSRT(1, 1, 1, 30, 0, 0, 0, 0, 2)
# Use variables as attributes of the MatrixSRT() to assign the
# attribute values of the whole Render Transformation property.
# Assigns custom property Rotation to a variable you use to control
# the rotation of an object.
rotate = {@./Rotation}
position = MatrixSRT(1, 1, 1, 0, 0, 0, 0, 0, 0)
# Assigns the rotation variable to each rotation attribute.
position.RotationX = rotate
position.RotationY = rotate
position.RotationZ = rotate
position
接下里看看绑定的表达式:
1、属性绑定:
语法:{[path]/[property]}
当你在路径前使用@符号,当资源和目标对象之间位置发生了改变,kanzi sudio会自动帮你更新绑定的表达式,否则,如果没有用@符号,节点相对位置发生了改变,表达式不会更新,绑定就会失效。但是要注意使用@符号用于属性绑定只能用于同一个模板,不能用于不同模板之间。
# Binds to property Layout Width of the current object.
{@./LayoutWidth}
# Binds to the property FOV of the Camera object.
{../Camera/Fov}
2、别名(alias)绑定
语法:{#[aliasName]/[property]}
# Binds to the Layout Width property of the target object of the alias named Sphere.
{#Sphere/LayoutWidth}
# Multiplies the FOV property of the target object of the alias named MainCamera
# with the Render Transformation property attribute Scale X.
{#MainCamera/Fov} * {../Box/RenderTransformation}.ScaleX
3、分量(attribute)绑定
语法:{[path]/[property].[attribute]}
# Binds to the attribute Scale X (value of the Scale X attribute)
# of the Box node's Layout Transformation property.
{../Box/LayoutTransformation}.ScaleX
# Multiply property FOV with Render Transformation property attribute Scale X.
{../Camera/Fov} * {../Box/RenderTransformation}.ScaleX
Kanzi学习(5):Kanzi的资源管理系统
今天我们来看一下Kanzi的资源管理系统(Resource management)。
在kanzi中,资源的定义很广泛,除了普通意义上的图片,模型,材质等这些资源,kanzi将app中使用的动画、属性类型、状态等也都统一称为资源,可以在kanzi studio下的Library窗口查看,如下图:
默认Library下会显示工程所有的资源,也可以在Window菜单下选择显示单独资源的窗口。下面,对这些资源做个了解:
Animations:显示工程中 animation data, animation clips, timeline sequences, 和 timeline entries in your project,都是和动画相关的;
Bookmarks:显示工程中的快捷方式;
Composing:显示工程中 composers, render passes, and filters .
Materials and Textures:显示工程中的brushes, materials, material types, shader formats, 和 textures .
Meshes:显示工程中的mesh data.
Property Types:显示工程中自定义的属性类型;
Resource Files:以文件夹划分工程中的资源文件,同步显示工程目录下的资源文件夹下的资源。当你在工程目录下的资源文件夹中加入了资源,kanzi studio会在Resource files下更新显示,但是你删除了工程目录下的资源文件夹中的资源,Resource files下需要你手动删除。当你将想加入工程的资源文件,可以拖拽到Resource Files下,kanzi会根据资源的类型,在工程资源目录响应的目录下创建一个资源的副本。Resource files通常不是app的一部分,除非你实例化了它们。
State Managers:显示工程中的状态管理;
Textures:显示工程中的材质;
Trajectories:显示工程中定义使用的轨迹。
这些资源kanzi是如何来进行处理的呢?通过什么方式来进行管理的呢?这就是今天的主题,kanzi的资源管理系统。