低代码到底是不是行业毒瘤?一线大厂怎么做的?戳此了解>>> 了解详情
写点什么

节选与书评:巨富客户端—桌面 Java 应用的动画与图形特效开发

2007 年 10 月 07 日

桌面 Java 应用的开发者长期以来都缺乏如何提升程序的外观形象的资料。Chet Haase 和 Romain Guy 尝试用他们的新书填补这个空缺。除了书评之外,我们还特别得到许可为读者们提供第 14 章的试读,以便你决定是否购买这本书。作者之一的 Chet Haase 为我们介绍节选的章节如下:

前面已经涵盖了许多 Swing 和 2D 渲染的基础,也讨论了基本的动画。这一章介绍的是定时框架(Timing Framework)类库,它让 Java 动画的编程变得更加容易。

一如既往,我们非常欢迎任何读过本书的人提出评论意见。

概述

什么是巨富客户端

“巨富客户端(Filthy Rich Client)”这个词是作者不久前生造出来的,用来描述“应用程序非常之富于视觉表现力,从中透出一股酷劲。[……] 简要来说,它们让用户享受在程序中的体验”。在此前提之下,本书解释了如何利用 Java2D 和 Swing 来增强你的应用程序。这两位作者非常有资格探讨这一主题。Chet Haase 在 Sun Microsystems 担任客户端架构师,他的工作内容与 Java2D 及 Swing 密切相关。Romain Guy 似乎没法长时间呆在一个地方,他从事过 IT 行业中的好几个领域。他在 Sun Microsystems 实习期间就被评为 Java Rock Star ,他为上两届 JavaOne 会议开发和演示的两个巨富客户端都得到了很高的赞誉。

读者对象

很简单,这本书的对象是那些打算让自己的 Java 桌面应用看起来很“酷”的开发者。我们在 Windows Vista、Mac OS X 和 Office 2007 当中都可以看到,各种特效真的能够实际提升应用程序的可用性。它们并不仅仅是给媒体播放器和即时通信客户端准备的。没有什么东西能够替代一个行为符合用户的期望,完全发挥出自身功能的应用程序。如果你打算让富客户端更上一级台阶,并且试图创造出有吸引力的界面来让用户觉得更加舒服,这本书就是为你准备的。

我为什么感兴趣?

我在几年中已经开发了不少 Java Swing 应用程序。虽然一般水平的桌面程序体验基本上已经能让我满足,但我最近的一个项目遇到了挫折,原因是它的 Java 根基和无法确定的性能“问题”。但当我开始将应用改得更加“巨富”(虽然这件事发生在前巨富客户端时代),批评者们反而不再那么在意那些所谓的 Java 问题,真正开始觉得使用程序是一种享受,因为它看起来比其他竞争软件更加酷。

我必须承认,我并不特别喜欢为编写 Java2D 代码和扩展 JComponents 而弄脏自己的双手。我通常极其乐于依赖第三方提供的漂亮外观(Look and Feel),比如用 Substance 外观来给我的应用镀层金就很不错。我只想写出能工作的程序。不过,我也总是很享受视觉上吸引人的程序,因此我知道也应该给我的用户提供一点说得过去的体验。眼前的这本书就正是要教会开发者们如何去做。

内容介绍

对作者来说,所谓“巨富”等同于特效和动画:渐变、反光、阴影、淡入淡出、画面过渡等等。Java 是极其多才多艺的,所有这些特效都做得到;问题是要完成这些特效还先要做许多打基础的工作。首先要掌握一些基础的图形算法。然后还要把这些算法转换成 Java2D 能接受的形式。接下来还有如何将图像绘制到屏幕,并且举止还要符合 Swing 的规矩。除此之外,也总是需要考虑性能问题。一句话,的的确确需要有些专家来引导开发者们,穿越“创造视觉丰富的应用程序”这个异常复杂的世界。

全书 19 章分为 4 个部分:

  • 图形与 GUI 基础
  • 高级图形渲染
  • 动画
  • 特效

虽然只有第 1 部分的标题里有“基础”这两个字,但依我看来,前 3 个部分实际上都是在打基础。就像在电影《The Karate Kid》里面一样,在你能够打得别人满地找牙之前,自己要先经过千锤百炼。

第 1 部分为图形的启迪之旅铺排了最基本的信息。本章中对 Swing 和线程的主题讨论恐怕是你所见当中最佳的。随后引导读者遍历了 Java2D 包中最有用的部分,这些都是你必须掌握的。最后讨论的是如何在 Java 的语境下理解“图像”的意义:各种图像类型,如何使用它们,以及如何最优化它们的性能。

第 2 部分才是真正进入了主题,这一部分给读者介绍了高级图形渲染技术。你在这一部分可以学到如何组合界面元素,建立色彩渐变,绘制图像的反射,以及给图像加上滤镜。这一部分也让你开始认识到 Swing 中 GlassPane 的威力,并学习如何使用 Layered Pane。你看了这几章才开始认识到自己懂得太少。显然,为你点出理解之关键所在,并为你呈现出最佳的实践,这正是本书存在的意义。

第 3 部分讲述动画。就我个人的感觉,这部分读起来是非常有意思的。这种感觉有些出乎我的意料,因为我本以为自己对这个主题并不是那么感兴趣。这部分简要介绍了动画的各种概念,也介绍了 Java 平台中提供的各种动画工具,特别是关键的定时机制。这部分最后的两章节讲述了 Chet 编写的定时框架(Timing Framework)。这个框架的存在的意义是为了让动画和定时尽可能地简单。正如书中所指出,为了设置定时器和确定动画的当前进度,需要编写大量必不可少却又一再重复的代码。这个框架消除了无聊和乏味,而且提供了许多其它有用的类,来实现触发器(使动画开始的事件)和时间插值(定义整段动画中帧速快慢的变化)。作为一个类库来说,这是一个设计得干净整洁的API 的极佳例子,它既非常符合自身的设计意图,又使得一个可能非常艰险的任务变得易于处置。

最后,全书的高潮在于第4 部分,这部分讲述特效。在这部分中,你把前面3 部分传授的知识综合到一起,并付诸实践——从这里你才真正开始去构建巨富客户端。其中一章展示了各种静态特效,比如模糊(用来在显示弹窗的时候弱化背景对注意力的干扰)、阴影、反光和高光。随后的一章讲述了动态特效,比如淡入淡出、脉动、弹簧和变形。紧跟着讲述画面过渡的一章特别有意思,它雄辩地说明了为何不应该突然地在各个画面间跳跃,而应该清晰地表明画面之间的相互关系。这一部分也给读者介绍了本书的第二个类库,叫做动画画面过渡(Animated Transitions),这个类库是专门设计来处理画面过渡的。而且,它也同样是一个经过深思熟虑的API,确确实实地方便了开发者加入这类功能。它让你实现起移动、缩放、淡入淡出和旋转等等标准效果得心应手,如果有需要,你还可以插入自定义的画面过渡效果。

可读性

这本书写得非常出色,也非常吸引人。它的写作风格是很随意的,这对于一本厚达600 页的书来说,大概是一件好事。读过Chet 的博客的人都知道,他并不介意说上一两句粗鄙一点的笑话,这本书也没能免疫——这些笑话并没加多少分,但也不至于减分。

公平地说,这本书并没有太过关注琐碎的细节,而从本书各个章节都十分易于吸收理解来看,这本书确实地证明了作者传达自身领域的专业知识的能力。文笔出色,图表也总是有所裨益,代码片断也运用得恰到好处。他们掌握了那种微妙的平衡,毫无疑问。显见的难点是作者不容易在静态媒体上图解动画和动态效果。为了能够最大程度地吸收这本书,你应该在演示例子和源代码上花些时间。

代码示例

写作编程书籍的一个难题是如何适当地平衡插在正文当中的代码数量。当然,平衡点取决于需要阐明的概念。在这本书中,作者对这个问题处理得很出色。书中大量的代码示例为你展示了各种任务应当如何编写,恰好满足你的需要;另一方面,每个代码片断又保持在最简单的程度,很少有超过一页篇幅的代码。作者为此常常采用的一种技巧是把对于理解当前例子不是必需的代码段用一行注释来代替。这是一种很有效的技巧,尽管你有时候因此不能照搬书上的例子,但例子也因此更容易理解吸收。而且读者明确地知道可以从配套网站上下载完整的代码。

书中展示的大部分源码都是摘自专门编写的演示程序,演示程序都可下载。源码按章分别打包成zip 文件,还特别为在Netbeans 中装载和运行做了准备。如果作者还能提供预编译的版本,比如一个WebStart 程序,让读者按两下鼠标就能运行,那样就更完美了。可能我这人太过挑剔。

在本文写作的时候,并不是所有的例子都准备好了。第16-18 章的演示还空缺着(顺便提醒读者,第19 章没有任何例子),这几章涵盖的是各种桌面效果和画面过渡,缺了演示真是说不过去。这个问题还连带导致读者也没法获得动画画面过渡(Animated Transitions)类库。

总结

让我们先说清楚,这本书并不会让你成为一名更出色的程序员。它不会教你如何使用Swing;你也不会学到如何正确地架构桌面应用。Chet 和Romain 的这本《巨富客户端》纯粹是讲述如何让你现有的功能完整的桌面应用在不同方面获得提高。

这是一本优秀的书:内行之作,步调清晰,解释详尽。它既不会迷失自己的主题,也不会在一个概念上纠缠太久。

本书没有涉及到Java 外观(Look and Feel)的领域,对此我并不意外,但仍然有些沮丧。重复地为每个应用扩展各种组件并不是好的长期策略。从围绕即将面世的 Nimbus 外观的热潮可以清楚地看出,开发者和用户都对可以立即获得吸引人的界面感到兴奋。毕竟,哪怕你加入了各种画面过渡、阴影和反光,也没有人会用“酷”来形容 Swing 的标准 Metal 外观。我理解这是一个庞大的题目,也许不适合一并放入这本书里。不过,如果能加上一些这方面的参考和指点会让这本书更有意思。

除了前面小小的抱怨,这本书里还是有很多很多值得学习的内容。至于哪些改进适合自己的应用,就留给读者自己去尝试和决定了。我知道每当我看完书中描述的效果,都会忍不住一一尝试它们。作者一定知道他们的作品有机会让 Java 桌面旧貌换新颜。我们必须提醒读者注意不要做过了头,别让程序画面塞满了特效。不过,看到一本炫耀 Java 平台的卓越能力的书仍然是非常令人开心的。Java 真的没什么理由不能征服桌面!


版权:本文节选的第 14 章来自新书《Filthy Rich Clients: Developing Animated and Graphical Effects for Desktop Java Applications》,作者为 Chet Haase 和 Romain Guy,由 Sun Microsystems Press 属下的 Addison-Wesley 在 2007 年 8 月出版。Copyright 2008 Sun Microsystems, Inc。ISBN-13: 9780132413930。更多信息请参阅: http://www.informit.com/title/9780132413930

下载试读章节:第14 章

查看英文原文: Book Excerpt and Review: Filthy Rich Clients - Developing Animated and Graphical Effects for Desktop Java Applications

2007 年 10 月 07 日 12:241548
用户头像

发布了 225 篇内容, 共 48.1 次阅读, 收获喜欢 27 次。

关注

评论

发布
暂无评论
发现更多内容

MySQL安全-审计

一个有志气的DB

安全 MySQ

《零基础学 Java》 FAQ 之 6-Java里Bean这个名字怎么来的

臧萌

Java spring

LeetCode 513. Find Bottom Left Tree Value

liu_liu

LeetCode

职涯思考

Kevin Z

职业 思考 工程师思维 硬件 工程师

战略懒惰有多可怕

Neco.W

创业 重新理解创业 初创公司

Web3极客日报#129

谢锐 | Frozen

区块链 独立开发者 技术社区 Rebase Web3 Daily

克服恐惧,勇于分享

孙苏勇

程序员 分享 工作

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (八)好单元测试的特质

编程道与术

Java 编程 软件测试 TDD 单元测试

Web3极客日报#141

谢锐 | Frozen

区块链 独立开发者 技术社区 Rebase Web3 Daily

修改网桥默认地址

奔跑的菜鸟

Docker

工作原则:决策要基于数据的支撑

Janenesome

高效工作 思考 原则

Leetcode 556. Next Greater Element III

隔壁小王

算法

我画了35张图就是为了让你深入 AQS

一枝花算不算浪漫

AQS jdk源码

玄铁重剑,我用过最贵重的键盘

池建强

ipad 苹果 键盘

“我XXXX,还能学编程吗?”

三号无名指

编程 工具 入门 转行程序员

Redis实现热卖商品排行榜

北漂码农有话说

redis

JVM源码分析之Object.wait/notify实现

猿灯塔

JVM

识别代码中的坏味道(一)

Page

Java 面向对象 重构

程序员小白的个人思考

程序员小岑

程序员 职场 思考 感悟

webpack入门系列之二——插件使用及热更新打包

子铭

Web

看完这篇,你也是字符编码大神(ASCII、Unicode、UTF-8、UTF-16、UTF-32)

Meandni

Java 面试 Unicode utf-8 utf-16

不要做软件开发团队中打破窗户的那个人

程序员小岑

程序员 思考 感悟 软件开发 团队

十大经典排序算法总结

淡蓝色

Java 算法 计算机基础 排序

VSCode 集成 Haskell 环境

liu_liu

vscode haskell hie Haskell Language Server

《零基础学 Java》 FAQ 之 5-如何在IntelliJ IDEA里配置JDK

臧萌

Java jdk intellij

测试开发专题:spring-boot自定义返回参数校验错误信息

测试轩

Spring Boot 测试

当你不被尊重的时候,才会想起去尊重别人

小天同学

人生 个人成长 感悟

香港科技大学与OSL海科签订无毒海洋防污技术独家授权协议

极客编

LeetCode 781. Rabbits in Forest

liu_liu

LeetCode

要做医生,不要做卖药的

Janenesome

高效工作 思考 沟通

Binlog2sql恢复误删除的数据

一个有志气的DB

MySQL 安全 数据

2021 ThoughtWorks 技术雷达峰会

2021 ThoughtWorks 技术雷达峰会

节选与书评:巨富客户端—桌面Java应用的动画与图形特效开发-InfoQ