定义了默认外观,大小和控件定位,节省许多从整个窗口.xml文件复制控件属性。例如,你可以设置大小和texture用于按钮控件,从而使得在皮肤文件的其余部分,不需要再注意这些细节,除非你想覆盖一个特定的默认窗口的外观或大小等。
非常有价值的,因为它可以在构建皮肤的时候让你极大的简化了很多的工作。一方面,这意味着,一旦你有包含文件设置,许多对不同的分辨率的默认参数,可通过只改变对不同分辨率的文件之内的参数进行。
让你拥有专用于一组特定属性的包含文件。
一个include的文件布局如下:
<?xml version="1.0" encoding="UTF-8"?>
<includes>
<include name="whitetext">
<textcolor>ffffffff</textcolor>
</include>
<include file="listdefaults.xml" />
<include condition="Skin.HasSetting(extras) file="includes_extras.xml" />
<default type="button">
<include>whitetext</include>
</default>
<constant name="leftedge">50</constant>
</includes>
你会注意到在上面的例子中有四个不同的include,
第一个<include>标签基本上允许它下面的标签替代它。例如,你有一个这样的window.xml
<control type="togglebutton">
<include>whitetext</include>
... other tags go here
</control>
它将代替include标签地方的<textcolor>标签,你可以定义任意多的include, 和include里面任意多的标签,甚至复杂的control,或者复杂的control组。
例子中的第二个<include>标签展示了如何从不同的文件中包含。由于没有指定include的名字,这个地方将包含整个文件的内容。
不同之处在于它可以用来在类型的每个控制 - 即使你不指定该控件是使用includes。因此,每一个buttoncontrol将有whitetext包括在里面。请注意,您可以通过在buttoncontrol指定<textcolor>标签覆盖。
最后, <constant> 标签允许你通过名称定义一个数字(浮点)常量,用于代替数值(<left>, height="" etc.),否则就使用数值。
5.1在 includes里面使用参数
只是让你不必为了改变只是一个或两个值,复制/粘贴大块的XML。include现在大约相当于编程语言“程序”。以下是已列入kodi最新的语法。
include的定义依然写在include标签之内,但是现在可以接受参数:
<include name="MyControl">
<param name="id"/>
<param name="left" default="120"/>
<param name="top">225</param>
<definition>
<control type="image" id="$PARAM[id]">
<left>$PARAM[left]</left>
<top>$PARAM[top]</top>
<width>370</width>
<height>40</height>
<texture>foo.png</texture>
</control>
<definition>
</include>
这里,第一部分被称为参数列表,并使用<param>标记中指定。当它存在,包括机身后面应该<定义>标记括起来。此刻,参数表是可选的,主要用于为参数指定的默认值(例如上面的120和225),但在其他方面并非强制性的。
上面的include可以这样被调用:
<include name="MyControl">
<param name="id" value="52"/>
<param name="left">300</param>
</include>
下面这样写有完全相同的效果:
<include name="MyControl">
<control type="image" id="52">
<left>300</left>
<top>225</top>
<width>370</width>
<height>40</height>
<texture>foo.png</texture>
</control>
</include>
可以这样被调用:
<include>MyControl</include>
并没有额外的好处。
在新的include调用中,任何合适的值都可以作为参数被传递,包括$INFO 标签,$LOCALIZE,$VARs, constants等。空字符也可以被传递,例如重写一个设置include 定义的非空默认值。
并扩展到通过任一实际值(如果它被传递),默认值(如果设置)或空字符串,在该顺序。
宗旨指定,但在其他方面没有必要,可以省略。
这真是一个风格问题,而有些人可能更喜欢写明确的参数列表来指定在include内所引用的所有参数。这是一个很好的做法,因为明确的参数列表可能在Kodi的未来版本将更好的利用。
如果没有<param>标记可言,<definition>可省略。这将使得语法更短:
<include name="MyControl">
<control type="image" id="$PARAM[id]">
<left>$PARAM[left]</left>
<top>$PARAM[top]</top>
<width>370</width>
<height>40</height>
<texture>foo.png</texture>
</control>
</include>
include可以调用其他(嵌套)include,甚至传递他们已经有了自己的确切参数值。这就是所谓的参数转发。
<include name="MyControl">
...
<include name="MyOtherControl">
<param name="label">$INFO[Player.Title]</param>
<param name="label2" value="x:$PARAM[left]; y:$PARAM[top]"/>
<param name="color" value="$PARAM[color]"/> <!-- forwarding -->
<param name="id" value="$PARAM[scrollbarid]"/> <!-- forwarding -->
</include>
...
</include>
这里,$ PARAM[颜色]和$PARAM[scrollbarid]将被转发到MyOtherControl,只有当参数颜色和scrollbarid实际上已经传递到MyControl,否则颜色和ID(如果设置MyOtherControl)的默认值将被使用在MyOtherControl里面。包含其它字符(如LABEL2)复合值不被视为“真正的”转发,并始终覆盖在嵌套设置包括任何默认值,即使他们扩大为空字符串。
5.2 Variables
Variables使其更易于使用有条件的infolabels。可以在Includes.xml定义它们,或使他们分离的,则可以将它们放置在它包含在Includes.xml另一个文件。您可以通过添加这样一行包括Includes.xml一个文件:
<include file="Variables.xml" />
Variables 可以用在任何支持 infolabels的标签中使用,如 texture, label和任何可见标签。
而不必包括符合条件整整两个controls,它们允许你只应用条件的实际texture or label。这意味着维护更少的control等。在变量的值被读出从上到下并且满足被使用的第一个条件。最后的值通常没有条件,它的内容作为后备。下面的例子显示专辑标签,如果玩家有音频,当年如果没有音讯,没有回退,使用(因为无论是或不是任何音频)。
<variable name="Example">
<value condition="Player.HasAudio">$INFO[ListItem.Album]</value>
<value condition="!Player.HasAudio">$INFO[ListItem.Year]</value>
<value>-</value>
</variable>
你可以在control标签中这样使用variable
<label>$VAR[Example]</label>
或者当变量值可能包含逗号(,)和/或引号(“):
<label>$ESCVAR[Example]</label>
5.3 Constants
如果你想多次重复使用某个值在你的skin,您可以为它定义一个constant
<constant name="FanartCrossfadeTime">300</constant>
<constant name="IconCrossfadeTime">300</constant>
现在你可以在任何地方通过名字引用此值:
<control type="image">
<left>0</left>
<top>0</top>
<width>256</width>
<height>256</height>
<texture background="true">$INFO[ListItem.Icon]</texture>
<fadetime>IconCrossfadeTime</fadetime>
</control>
5.4 Defaults
每一个控件类型,您可以定义默认模板。比如这里有一个按钮控件模板:
<default type="button">
<left>0</left>
<top>0</top>
<width>700</width>
<height>40</height>
<label>-</label>
<texturefocus border="20">list-focus.png</texturefocus>
<texturenofocus border="20">list-nofocus.png</texturenofocus>
<font>font20</font>
<textcolor>white</textcolor>
<focusedcolor>blue</focusedcolor>
<disabledcolor>darkgrey</disabledcolor>
<invalidcolor>red</invalidcolor>
<textoffsetx>10</textoffsetx>
<aligny>center</aligny>
<pulseonselect>true</pulseonselect>
</default>
定义缺省值的好处是,Kodi将可以在任何地方使用模板,当按钮被使用,所以你不必全部为每个按钮的标签编码。你只需要编你想从默认模板。