在如今这个服务至上的年代,GUI这个东西,可以说在很大程度上决定了用户体验,而用户体验,又在很大程度上决定了一款软件是不是卖得出去。只有界面做得漂亮而内容是空壳的软件卖不出去,而功能强大但界面垃圾的软件照样卖不出去。于是,不论是桌面应用还是Web应用,软件都需要包装。
包装后的东西,是用来吸引用户眼球的。中国有句古话,叫做“耳听为虚,眼见为实”,而我们在学马列主义的时候,告诉我们要辩证地看问题,耳听未必为虚,眼见未必为实,在现在这个注重包装的年代,眼见未必为实,再正确不过了。
作为一个程序开发人员,也许你已经久经沙场,也许你已经钻研了N久底层的东西,但是在技术面前,我们总会有方方面面的限制,有些来自于平台,有些来自于架构,有些来自于安全性考虑,有些来自于用户需求……马列主义说得好,自由是对真理的追求。在真理面前,我们不可能有绝对的自由,就像我们跳起来挣脱不了地心引力一样,在软件设计的时候,我们也无法摆脱方方面面的束缚。但是好在我们人类懂得变通,因此有些时候,设计人员和开发人员,在“是”和“看起来是”之间,下足了功夫。
is和seems这两个词区别太大了,我们在设计UI的时候,完全可以用各种各样的方法去欺骗用户,让用户感觉到自己在使一个“是”什么什么的东西,而完全没有发现自己只是在用一个“像”什么什么的东西。这种例子太多了,数不胜数,在网页制作上,在应用css的时候,人们发明了各种各样骗人的伎俩,但也正是因为这些伎俩,网页才变得那么漂亮,操作性才那么强。
今天我在silverlight官网上看到一条广告,是说有公司做silverlight控件,我去他们在线的demo上看,发现了一个另我感到非常奇怪的事情。学过silverlight的同学可以打开盾一看:http://samples.visualwebgui.com/MainForm.swgx。点左侧导航里的Controls-HostControls-FlashBox,神奇的事情出现了,你可以看到一个漂亮的flash被“嵌”到silverlight程序里面。我一看就想,天哪,居然还有控件可以加载swf文件哪,真厉害,可得研究研究是怎么实现的。于是我不辞辛劳的将它的xap文件下载下来,改后缀,解压缩,再用reflector去看源代码……可怜我找遍了里面所有的class,就是没发现还有个放flash的容器。我想这不能啊,难道小样的骗我?终于在我反复研究我发现了破绽。默认情况下,如果在silverlight应用上点右键,会显示“silverlight配置”(当然你可以通过html dom注册右键点击事件,在silverlight代码中去掉默认行为,具体以后再说,这里只提一下),但是点到那个flash的时候,出现的却是flash配置。难道是人家向右击事件里注册了新的呈现吗?也不能啊,就真能做得这么逼真,和直接点网页上的swf效果一模一样吗?我接着研究,最终得到了一个个人认为最为合理的解释:设计的人做了一个iframe(其实用div也可以,只是那样别人一看网页源文件马上露馅,这么做能保险点),在点击FlashBox的时候,向这个iframe中填充内容(就是那个flash)并且进行定位,然后将它的Z-Index设得比含有Silverlight应用的那个div高,那么它就将显现在silverlight应用之上,因此右键点击的时候,出现了点在flash上的默认行为,而没有出现“silverlight配置”那个对话框。
我不知道自己的推断是不是正确——我想至少是八九不离十。提起这个的原因就是想说,这个东西让我白白兴奋了半天,以为silverlight应用现在可以内嵌html页面以及flash,但没想到这个所谓的FlashBox只是个骗人的东西(那个AspPageBox也一样是骗人玩的),在感叹世风日下人心不古的同时,我就想如果是个普通用户在用这个网站,甚至不会去想FlashBox是不是控件,说起来也是,它是不是控件关用户鸟事,我点了那个东西就出来一个flash我看着挺好看的不就得了,我的眼球是不是被骗了又何妨。看到美女要提防是不是去韩国整过容是要担心结了婚生孩子是有基因问题的,这个GUI永远是用来看的,不能用来下小的。。。
所以我想,以后设计应用的时候,也要考虑一下is和seems的问题,也许一个东西用is去做能累死,但是用seems去做几分钟就搞定了,而对普通用户来说完全是无差别的事情。尤其是像silverlight这种运行在沙盒里的东西,为了安全起见这也不行那也不行,寻求一点html的帮助让它看起来是silverlight的一部分而且达到目的,这才是我们应该做的。
最后,我想说的是,UI用来骗人欺骗的是用户,可千万不能自欺欺人,silverlight运行在沙盒里自然有它的道理,所以设计的时候,也要充分考虑安全问题(一般来说用asp.net的安全机制就已经足够了,当然这是个人感觉)。
缥缈落花街 月圆月缺 望峦山平川 雁返君未还 怆然晚春残 忆天上人间