XBMC源代码分析 2:Addons(皮肤Skin)
前文已经对XBMC源代码的整体架构进行了分析:
从这篇文章开始,就要对XBMC源代码进行具体分析了。首先先不分析其C++代码,分析一下和其皮肤相关的代码。
XBMC 的和皮肤相关的代码位于 "根目录/addons" 里面。可以从官方网站上下载皮肤文件的压缩包,然后解压到该目录下面即可。皮肤文件夹名称一般是“skin.XXXX”形式的,即以“skin.”开头。
XBMC自带的皮肤存储在文件夹“skin.confluence”中。我从网上下载了4个皮肤,解压后,如下图所示。
系统默认的皮肤:confluence如图所示。
可以在“skin”选项里面选择皮肤,如图所示。
皮肤“simplicity”如图所示。
皮肤“SiO2”如图所示。
可以看出。不同皮肤之间差距非常的大。皮肤囊括了XBMC所有可以看见的界面元素。可以说不修改源代码,只制作皮肤,也可以完全定制出一套非常个性化的系统。
下面我们以系统自带的皮肤“confluence”为例,分析一下皮肤的构成。
skin.confluence文件夹中,目录结构如图所示:
每个文件夹的作用:
720p:界面存放于文件夹里
background:背景图片
font:字体
language:各种语言支持
media:各种图标
sound:声音
例如,background文件夹内容:
media文件夹内容:
下面重点研究720p文件夹中的内容。这个文件夹中存储了界面的布局信息。系统会根据这个文件夹中的布局信息(xml形式)设置窗口的大小,并去其他文件夹中查找相关的素材。
我们以系统的“设置”页面为例研究一下布局信息。系统的布局页面如下图所示。
“设置”页面对应的布局信息文件为Settings.xml。
时间所限,就不逐行注释了。语法理解起来还是比较容易的。总结以下几点:
1.语法与HTML类似。最外层的<window>相当于<html>。<controls>相当于<body>。<control>类似于<div>,是可以嵌套的。<content>相当于<ul>,<item>相当于<li>。当然,这只是打个比方,方便理解。
2.各种组件都是<control>,就是属性“type”不一样。例如“image”,“group”等等。<control>中
<left>,<top>,<width>,<height>表示窗口位置;
<animation>表示其动画效果;
<onleft>2</onleft>表示遥控器按向左键时如果焦点还在控件里面,并且己经是最左边一个元素时,将焦点切换到ID为2的控件;<onright>,<onup>,<ondown>与此类似。
<!-- 雷霄骅 leixiaohua1020@126.com 中国传媒大学/数字电视技术 --> <?xml version="1.0" encoding="UTF-8"?> <window> <defaultcontrol always="true">9000</defaultcontrol> <allowoverlay>no</allowoverlay> <controls> <include>CommonBackground</include> <control type="image"> <left>0</left> <top>100r</top> <width>1280</width> <height>100</height> <texture>floor.png</texture> <animation effect="slide" start="0,10" end="0,0" time="200" condition="Window.Previous(Home)">WindowOpen</animation> <animation effect="slide" start="0,0" end="0,10" time="200" condition="Window.Next(Home)">WindowClose</animation> </control> <control type="group"> <left>90</left> <top>30</top> <animation type="WindowOpen" reversible="false"> <effect type="zoom" start="80" end="100" center="640,360" easing="out" tween="back" time="300"/> <effect type="fade" start="0" end="100" time="300"/> </animation> <animation type="WindowClose" reversible="false"> <effect type="zoom" start="100" end="80" center="640,360" easing="in" tween="back" time="300"/> <effect type="fade" start="100" end="0" time="300"/> </animation> <control type="image"> <left>5</left> <top>5</top> <width>1090</width> <height>630</height> <texture border="15">ContentPanel.png</texture> </control> <control type="image"> <left>5</left> <top>625</top> <width>1090</width> <height>64</height> <texture border="15">ContentPanelMirror.png</texture> </control> <control type="button"> <description>Close Window button</description> <left>980</left> <top>11</top> <width>64</width> <height>32</height> <label>-</label> <font>-</font> <onclick>PreviousMenu</onclick> <texturefocus>DialogCloseButton-focus.png</texturefocus> <texturenofocus>DialogCloseButton.png</texturenofocus> <onleft>1</onleft> <onright>1</onright> <onup>1</onup> <ondown>1</ondown> <visible>system.getbool(input.enablemouse)</visible> </control> <control type="image"> <description>LOGO</description> <left>30</left> <top>15</top> <width>220</width> <height>80</height> <aspectratio>keep</aspectratio> <texture>Confluence_Logo.png</texture> </control> <control type="list" id="9000"> <left>10</left> <top>82</top> <width>260</width> <height>541</height> <onleft>9000</onleft> <onright>9001</onright> <onup>9000</onup> <ondown>9000</ondown> <pagecontrol>-</pagecontrol> <scrolltime>300</scrolltime> <itemlayout height="54" width="260"> <control type="image"> <left>0</left> <top>0</top> <width>260</width> <height>55</height> <texture border="5">MenuItemNF.png</texture> </control> <control type="label"> <left>250</left> <top>0</top> <width>380</width> <height>55</height> <font>font24_title</font> <textcolor>grey3</textcolor> <align>right</align> <aligny>center</aligny> <label>$INFO[ListItem.Label]</label> </control> </itemlayout> <focusedlayout height="54" width="260"> <control type="image"> <left>0</left> <top>0</top> <width>260</width> <height>55</height> <texture border="5">MenuItemFO.png</texture> </control> <control type="label"> <left>250</left> <top>0</top> <width>380</width> <height>55</height> <font>font24_title</font> <textcolor>white</textcolor> <align>right</align> <aligny>center</aligny> <label>$INFO[ListItem.Label]</label> </control> </focusedlayout> <content> <item id="1"> <label>480</label> <label2>31400</label2> <onclick>ActivateWindow(AppearanceSettings)</onclick> <icon>-</icon> </item> <item id="2"> <label>157</label> <label2>31401</label2> <onclick>ActivateWindow(VideosSettings)</onclick> <icon>-</icon> </item> <item id="3"> <label>31502</label> <label2>31409</label2> <onclick>ActivateWindow(PVRSettings)</onclick> <icon>special://skin/backgrounds/tv.jpg</icon> </item> <item id="4"> <label>2</label> <label2>31402</label2> <onclick>ActivateWindow(MusicSettings)</onclick> <icon>-</icon> </item> <item id="5"> <label>1</label> <label2>31403</label2> <onclick>ActivateWindow(PicturesSettings)</onclick> <icon>-</icon> </item> <item id="6"> <label>8</label> <label2>31404</label2> <onclick>ActivateWindow(WeatherSettings)</onclick> <icon>-</icon> </item> <item id="7"> <label>24001</label> <label2>31408</label2> <onclick>ActivateWindow(AddonBrowser)</onclick> <icon>-</icon> </item> <item id="8"> <label>14036</label> <label2>31410</label2> <onclick>ActivateWindow(ServiceSettings)</onclick> <icon>-</icon> </item> <item id="9"> <label>13000</label> <label2>31406</label2> <onclick>ActivateWindow(SystemSettings)</onclick> <icon>-</icon> </item> </content> </control> <control type="image"> <left>268</left> <top>10</top> <width>804</width> <height>50</height> <texture border="5">black-back2.png</texture> </control> <control type="image"> <left>268</left> <top>10</top> <width>804</width> <height>70</height> <aspectratio>stretch</aspectratio> <texture>GlassTitleBar.png</texture> </control> <control type="label"> <description>header label</description> <left>300</left> <top>20</top> <width>740</width> <height>30</height> <font>font16</font> <label>$LOCALIZE[31000] $LOCALIZE[5]</label> <align>left</align> <aligny>center</aligny> <textcolor>white</textcolor> <shadowcolor>black</shadowcolor> </control> <control type="image"> <left>270</left> <top>60</top> <width>800</width> <height>450</height> <texture border="5">button-nofocus.png</texture> </control> <control type="image"> <left>272</left> <top>62</top> <width>796</width> <height>446</height> <aspectratio>stretch</aspectratio> <fadetime>600</fadetime> <texture background="true">special://skin/backgrounds/settings.jpg</texture> </control> <control type="image"> <left>272</left> <top>62</top> <width>600</width> <height>340</height> <aspectratio>stretch</aspectratio> <texture>GlassOverlay.png</texture> <colordiffuse>AAFFFFFF</colordiffuse> </control> <control type="image"> <left>268</left> <top>510</top> <width>804</width> <height>118</height> <texture border="5">black-back2.png</texture> </control> <control type="textbox"> <description>Appearance Description</description> <left>300</left> <top>520</top> <width>740</width> <height>100</height> <font>font12</font> <label>$INFO[Container(9000).ListItem.Label2]</label> <align>left</align> <textcolor>white</textcolor> <shadowcolor>black</shadowcolor> </control> </control> <include>CommonNowPlaying</include> <include>MainWindowMouseButtons</include> <include>BehindDialogFadeOut</include> <control type="image"> <description>Section header image</description> <left>20</left> <top>3</top> <width>35</width> <height>35</height> <aspectratio>keep</aspectratio> <texture>icon_system.png</texture> </control> <control type="grouplist"> <left>65</left> <top>5</top> <width>1000</width> <height>30</height> <orientation>horizontal</orientation> <align>left</align> <itemgap>5</itemgap> <control type="label"> <include>WindowTitleCommons</include> <label>$LOCALIZE[5]</label> </control> </control> <include>Clock</include> </controls> </window>
XBMC源代码分析 2:Addons(皮肤Skin)的更多相关文章
- XBMC源代码分析 7:视频播放器(dvdplayer)-输入流(以libRTMP为例)
前文分析了XBMC的基本结构: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分 ...
- XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...
- XBMC源代码分析 4:视频播放器(dvdplayer)-解码器(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 本文我们分析XBMC中视 ...
- XBMC源代码分析 3:核心部分(core)-综述
前文分析了XBMC的整体结构以及皮肤部分: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) 本文以及以后的文章主要分析XBMC的VC工程中的源代码. ...
- 转:XBMC源代码分析
1:整体结构以及编译方法 XBMC(全称是XBOX Media Center)是一个开源的媒体中心软件.XBMC最初为Xbox而开发,可以运行在Linux.OSX.Windows.Android4.0 ...
- XBMC源代码分析 1:整体结构以及编译方法
XBMC(全称是XBOX Media Center)是一个开源的媒体中心软件.XBMC最初为Xbox而开发,可以运行在Linux.OSX.Windows.Android4.0系统.我自己下载了一个然后 ...
- XBMC源代码简析 5:视频播放器(dvdplayer)-解复用器(以ffmpeg为例)
XBMC分析系列文章: XBMC源代码分析 1:整体结构以及编译方法 XBMC源代码分析 2:Addons(皮肤Skin) XBMC源代码分析 3:核心部分(core)-综述 XBMC源代码分析 4: ...
- android-plugmgr源代码分析
android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...
- Twitter Storm源代码分析之ZooKeeper中的目录结构
徐明明博客:Twitter Storm源代码分析之ZooKeeper中的目录结构 我们知道Twitter Storm的所有的状态信息都是保存在Zookeeper里面,nimbus通过在zookeepe ...
随机推荐
- Docker多台物理主机之间的容器互联
Docker 默认的桥接网卡是 docker0.它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 veth* 而 Docker 只是把所有这些网卡桥接在一起,如下: [root ...
- LuaHotUpdate原理
LuaHotUpdate原理(金庆的专栏)项目地址:https://github.com/asqbtcupid/lua_hotupdate只更新函数,不更新数据.主页上有个动画演示.限Windows平 ...
- ViewPager实现首次进入软件时左右滑屏的软件展示效果
效果如图: 图片资源不再提供,大家可以自己下载,能实现效果即可,看代码: 首先是展示界面的layout: view.xml 注意,采用的是帧布局,页面切换时的小圆点是在各张图片之上的 <?xml ...
- WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码
OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...
- TextView + Spanned实现图文混排以及图片点击交互
最近要实现图文混排的需求,webview过大,所以想到了用SpannableStringBuilder来实现. 不过参考了大量国内文章,大多数是教你如何实现图文混排,并没有提及图片点击交互的.有翻阅了 ...
- Android监听屏幕解锁和判断屏幕状态
开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为 android.intent.action.USER_PRESENT的广播,则可以监听解锁事 ...
- memcached实战系列(六)理解Memcached的数据存储方式
Memcached的数据存储方式被称为Slab Allocator,其基本方式是: 1:先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题.启动参数的时候配置进去的不懂得可以参考 ...
- 混合开发(一)——WebView开发高级技巧之加载网页以及JavaScript,加载进度条
混合开发(一)--WebView开发高级技巧之加载网页以及JavaScript,加载进度条 现在关于混合开发也越来越多了,很多人喜欢跟随,比如HB,比如RN,其实这东西很早就有这么一个概念了,而且说实 ...
- 一个iOS6系统bug+一个iOS7系统bug
先看实际工作中遇到的两个bug:(1)iPhone Qzone有一个导航栏背景随着页面滑动而渐变的体验,当页面滑动到一定距离时,会改变导航栏上title文本的颜色,但是有一个莫名其妙的bug,如下:
- 显示图像的SIFT flow描述子
close all; % 模拟figure 5 im = zeros(401,401,3); im(:,:,:) = 0; im(2:200, 2:200, 2) = 255; im(202:400, ...