Plasma主题简介

csslayer | 2010/12/17

KDE的Plasma主题是直观上KDE4最重要的变化之一,带来了完全不同的桌面界面体验。那么这些Plasma主题究竟是怎么制作出来的呢?这就不得不提到svg。

可缩放矢量图形(Scalable Vector Graphics,SVG),是一种图片格式,和png,jpeg,bmp不同,它是通过描述图片当中的矢量而不是像素而制成的图片。比如一条直线,位图就是描述某些点是黑色,最终连成一条直线,而svg则是描述从点p到点q有一条直线这样的一种形式,因此具有可以任意缩放的优点。

Plasma的主题就是由诸多这样的SVG图片组成的。说起来,制作一个这样的主题并不是非常容易。对于一般人来说,既没有时间也没有精力花气力重新制作一套主题。这里仅仅介绍一些常见的元素是如何构建的,希望最后对于某些细节瑕疵的主题,大家可以手动做一些小修正来达到完美的效果。如果真的有心制作一个完整的主题的话,不妨从一个已有主题来慢慢构建。在kde-look上也有一些混合型主题,就是将不同主题的元素组合起来,自己只调整比较少的部分,也可以做出很好看的主题。

说起svg,就不得不提到svg编辑无出其右的利器,inkscape。inkscape的具体使用这里就不赘述了,大家上手试试就知道了。

我们从一个最基本的元素widgets/background说起。plasma的每个元件都是采用不同的svg图片拼接而成,比如滚动条,面板,背景都是不同的svg文件,每一个plasma的元素有一个对应的文件,比如widgets的背景就是widgets/background。因为对于没有混成管理的xserver来说半透明是无法显示的,所以大部分plasma主题也为这些元素准备了一套不透明的主题,放在 opaque目录下面,opaque目录内部的组织和根目录很像,就是在窗口无法混成的时候,可以使用这些文件从而达到更好的效果,否则就会有奇怪的黑边。KDE4.5的新feature是采用新KDE的托盘图标可以根据plasma主题改图标,这些svg图标都是放在icons木下的。KDE4.5的另外一个变化是出了opaque,还有translucent这个目录,对应就是开启模糊的情况下,使用的文件。所以看起来开启窗口模糊之后,air主题会看起来更加透明。

对于最基本的几个元素,widgets/background,dialogs/background,看看就能够立即发现自己使用的主题的身影。对于background系列的这两个svg来说,它采用了九宫格的方式进行缩放,将一个图片拆分为九份,四个角不变化大小,四个边只在横向或者竖向变化大小,中间部分是直接resize。这样和直接缩放比起来在边界上也会获得很好的效果。

有意思的是,这些子图是在同一个文件中描述的,如果了解html的domtree的话,这可能更好理解,每个小部分都会被分配一个id,根据id来确定每个部分的作用。

说起来,一个plasma主题仅仅有svg图片,而没有任何配置文件,它是如何描述边界信息的呢?在plasma的图片中,经常会看到一些绿色的矩形,plasma就是根据这些矩形的宽度来确定边界的范围的。

在inkscape当中每个图块都被构成了group并且制定了id。每个id都有特殊的功能。

制作Plasma主题,基本来讲比较像搭积木,和做网页花的功夫可能差不多,不断调整每个块的颜色,背景,大小,最后达到最好的效果。还有一些比较特殊的widget,比如lancelot,plasma的基本组件不足以创建这样的图,怎么办呢?就会有一些specific的部件用于构成这个主题。

做完的plasma主题制作成zip,上传到kde-look对应分类之后,就可以通过get new stuff来安装了。或者手动解压到~/.kde4/share/apps/desktopthemes。

具体制作上还是挺麻烦的,我也只手动修改过某些主题的细节,来修正一些显示上的bug。旨在让有兴趣的人做一个入门的了解,而不是完整的制作教程。具体制作从参考一个已有主题会简单得多。

Tags:

3 FEEDBACKS

  1. chwt

    在 svg 还没有普及的情况下,kde 的主题制作的确比较能上手,话说 kde 为什么要弄成这样的主题框架呢?直接用 png 或者类似 gtk 那样的不行么?只是因为 svg 具有无级缩放的优点?

  2. chwt

    @chwt 上面的“能上手”打错字了,是“难上手”

  3. csslayer

Leave a Reply

Your email address will not be published. Required fields are marked *

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).