颜 林 2009 年 12 月 10 日 HTML HTML5 下面内容
首先我们创建一个新的 html 文件 thumbnail.html,加入如清单 1 所示的内容: 清单 1.thumbnail.html
这里我们可以看到,canvas 是 html 现在我们创建一个新的 JavaScript 文件 清单 2 .thumbnail.js
代码定义了一个初始化函数 load,并且声明了 thumbnail 类,这样我们就可以在 thumbnail 类中添加代码,在 Canvas 上绘制各种图形以及图像了。 设计界面 我 图 1. 界面设计
首先我们绘制如图 2 所示的一个导航栏。在左右两边各有一个按钮,按钮上显示一个三角形的指示图形。当鼠标放到一个按钮上时,按钮的背景色能变成高亮的颜色,显示当前选中的按钮。 图 2. 导航框 清单 3 显示了绘制图 2 所示的导航栏的代码片段。 清单 3 . 绘制导航框代码
如上所述,在页面 html 中我们声明了 清单 4. 获得绘图上下文
获得上下文对象之后,我们就可以通过 Canvas 提供的 API 来进行绘画了。在清单 5 中,我们使用了矩形的绘制函数来绘制整个导航栏背景和左右两个按钮。所下所示: 清单 5. 矩形绘制函数
例如,我们要绘制一个简单的矩形可以用如清单 6 所示代码: 清单 6. 绘制简单矩形
我们绘制该导航框时,需要在左右两边各绘制一个三角形,对于除了矩形以外的所有多边形,必须得通过路径来绘制,常用的路径相关函数有 : 清单 7. 绘制路径函数
这样,我们在绘制三角形的时候,只需要确定三个顶点的坐标,就可以通过 lineTo 函数绘制三条线段,但是,我们还需要一个函数在该三角形区域内填充颜色,这样需要用到填充和描边的函数和样式: 清单 8. 填充和描边样式
这里 color 值可以是标准的 CSS 颜色值,还可以通过 rgba 函数设置透明度。我们可以如下设置: 清单 9. 填充样式举例
同样,当需要填充颜色样式或者描边时,有如下函数: 清单 10. 填充和描边函数
这样,用上述几个函数,我们绘制一个三角形时,可以用如下语句: 清单 11. 绘制三角形代码
在清单 3 中,我们还声明了一些常量来定义导航栏的各种控件的大小,其中长度值都是以像素为单位的。这样我们绘制了整个导航栏,但我们现在需要当鼠标放到按钮上时,按钮的前景色能够高亮,显示当前选中的按钮。这就需要我们在代码中响应用户事件,并进行不同类型的绘制。 响应用户事件和普通的 DOM 编程类似,如清单 12 所示: 清单 12. 响应鼠标移动时间
这样我们就绘制了一个完整的导航栏,它能够响应鼠标移动事件,并高亮当前选中的按钮。下面我们需要加载和显示图片,这就需要用到 Canvas 的绘制图像函数。
加载和显示图像的代码片段如清单 13 所示: 清单 13. 加载和显示图像
在清单 13 的代码中,我们更新了主绘制函数 图 3. 最佳缩放比例示例 这里缩放比例是通过本例所定义的函数 getScaleRatio 来获得的,其详细代码见附件。这样我们可以在 Canvas 上绘制图像,绘制图像的函数定义如下 : 清单 14. 绘制图像函数
但该函数还无法满足我们的要求,我们需要缩放图片到一个最佳大小,这就需要 Canvas 绘制图片函数的另外一种形式: 清单 15. 绘制图像函数 2
该函数将图片缩放到 width 和 height 所指定的大小并显示出来。我们通过函数 getScaleRatio 来计算最佳缩放大小,然后就可以通过如清单 15 所示来绘制最佳大小的图片。 绘 清单 16. 加载图片代码
在整个程序中,我们利用了 setInterval 绘制缩略图 下一步需要在导航栏中绘制每个图片的缩略图,该缩略图必须按照最优的大小和间隔排列在导航栏中,同时缩略图必须经过裁剪,获得最优的显示区域。整体效果如图 4 所示: 图 4. 缩略图效果 实现代码片段如清单 17 所示: 清单 17. 缩略图代码
清单 17 的代码使用了 Canvas 中坐标转换的方法来绘制每张缩略图。转换坐标函数如清单 18 所示: 清单 18. 转换坐标函数
其原理如图 5 所示: 图 5. 转换坐标 Canvas 将图片显示到缩略图中,我们还需要把图片缩放到其中较短的一边能够和缩略图的边长重合,同时截去超出缩略图大小的图片部分,从而达到最优的显示缩略图的效果。其示意图如图 6 所示。 图 6. 截取最佳图片部分 为 清单 19. 绘制图像函数 3
该函数截取原图片的部分区域,然后缩放显示到目标区域中。我们利用这个函数,就能够实现截取最佳区域以显示在缩略图中的效果。 在绘制缩略图我们还实现了一个小技巧:缩略图大小是固定的,但之间的间距是动态调整的,当缩略图之间的间距小于一个阀值的时候,我们强制最小间隔不小于阀值,详细代码请看清单 17。 显示缩略图以后,我们需要响应点击事件,即能够点击缩略图,显示所对应的图片。同时,我们还需要点击左右两边的按钮,能够实现缩略图的翻页。这是通过清单 20 所示的代码实现的: 清单 20 . 响应鼠标点击事件
这里我们通过 2 个变量 firstImageIndex 和 currentImage 来控制缩略图和当前图片的显示,并能够根据鼠标点击来改变当前选中的图片。
当浏览器的大小改变的时候,我们的图片浏览器就会由于没能重画导致部分区域无法显示。我们需要根据浏览器当前页面大小来动态定义整个图片浏览器的大小,从而能够调整整个图片浏览器的最佳大小。代码如清单 21 所示: 清单 21 .Resize 支持
这里代码响应了 window 对象的 onresize 我们还需要实现这种效果:当鼠标放置在某个缩略图上方时,能够显示一个缩略图预览界面,其效果如图 7 所示: 图 7 . 缩略图预览 实现代码如清单 22 所示: 清单 22 . 缩略图预览代码
在函数 paintHighLightImage 中大量使用了 Canvas 的路径绘图函数来绘制这个底部为三角形箭头,上部为矩形的形状。感兴趣的读者可以研究这些 Canvas 绘图函数的使用。 最后我们在加入一个动态的效果:当鼠标不再移动超过一定时刻的时候,导航栏能够自动隐藏。其代码如清单 23 所示: 清单 23 . 自动隐藏代码
当空闲时间超过阀值时,导航栏能够自动隐藏,这样浏览图片更加方便。 在合并了上述所有清单代码之后,我们在浏览器上就可以看到如图 8 所示的效果。 图 8 . 完整的图片浏览器效果 完整的代码请看附件。运行代码需要 Firefox 1.5, Chrome 1, Safari 3 以上版本的浏览器。
本 从
|