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).

This site uses Akismet to reduce spam. Learn how your comment data is processed.