基本概览

Canvas是HTML5中新增的新标签,提供了一套强大的使用JavaScript绘制画布的API。

简要概括Canvas功能,主要包括:

  1. 形状绘制,包括线条及其组成的其他形状;而绘制又分为Fill和Stroke两种形式,前者填充整个形状,后者只绘制边框;
  2. 文本绘制,往往同时需要对其Style进行设置;
  3. 图片绘制,一方面对图像进行裁剪缩放等处理,另外也可以通过对修改图片内容数据imagedata来达到更精准的像素级图像控制;
  4. 另外提供对绘制状态的控制,以及对绘制状态的转换;
  5. 通过requestAnimationFrame以及setInterval在Canvas上实现动画效果。如下图:

应用实践

Flyme主题编辑工具是提供给Flyme主题开发者在线编辑制作个性化主题的工具,支持实时预览编辑效果,并按要求保存所需编辑信息。点击这里的链接看效果:http://designer.meizu.com/resources/theme/html/index.html

应用一:文字图像绘制

在Flyme主题在线编辑工具中,需要提供给开发者实时的编辑预览,主要是显示手机的各个操作界面,包括文字和图标及一些背景和分隔线。

暂时考虑到两种实现方案:1. DIV+CSS+DOM操作;2. Canvas显示+JS绘制。

该应用有两个特征:1. 界面元素比较多,包括较多的图片、文字说明以及线条等其他形状;2. 开发者需要频繁替换图片并实时查看显示效果。

一方面,过多的DOM节点对页面性能会造成影响;另一方面,使用JavaScript绘制Canvas比DOM操作效率要高;我们使用Canvas方案来实现预览界面的显示和绘制。该部分的实现代码比较基础,不一一列举。主要应用到文本、图片、线条的绘制,部分预览效果图如下:

应用二:Android .9.png图片绘制

Android .9.png介绍

Android .9.png图片在安卓中一般用作背景图片使用,通过图片最外层一个像素的黑边信息来确定拉伸区域和内容区域,除拉伸区域外的其他部分并不随图片放大而放大,而是保持原始大小,从而保证使用最小尺寸的图片完成任意大小内容的正确显示,确保不规则背景图任意缩放后不变形。

Android .9.png图示例结构图如下:左侧为缩放后的示意图;右侧为放大结构示意图,四周最外层黑色块为.9信息,两个绿色框(由于对应左边和上边的黑点只有一个像素,所以这里是两条线)的交集部分为缩放拉伸区域,另外两个黑色框的交集部分为内容显示区域。

Android .9.png绘制原理

以短信背景图气泡为例,首先了解.9.png图片的绘制原理,主要分三步:1. 获取到图片的.9信息(黑边的坐标位置),这样就可以确定拉伸区域和内容区域;2. 根据拉伸区域的坐标位置,正确的绘制图片(根据内容多少进行缩放);3. 根据内容区域的坐标位置,绘制内容到正确位置。

清楚了.9.png的显示原理,很快就可以找到解决方法:1. 通过Canvas的getImageData接口获取到.9.png的像素数据;2. 取其最外层一个像素点数据便可以找到对应黑边的位置;3. 再根据这些位置点截取原图的各块来进行对应绘制。我们使用的是jCanvas.js,具体实现细节可参考jcanvas.js中的draw方法源码。下面列出效果图(短信背景图和资讯背景图):

已编译的Android .9.png黑边信息获取

实际绘制过程中,还会遇到被编译过的.9.png,这些图不能简单的根据以上信息来取.9信息,而是从png图片结构分析着手取得,绘制的后续步骤完全一致,获取被编译后.9.png。图片.9信息的示例代码截图如下:

应用三:在线截屏

开发者在使用Flyme主题在线编辑工具打包时,需要系统为开发者新编辑的主题截屏生成主题预览图提供给用户预览,这样免去了开发者手工截屏上传的麻烦,提高系统智能性。

我们使用Canvas的toDataURL接口解决该需求,把在Canvas上绘制的内容转换成Base64格式,然后通过JSZip来将其存储为本地图片。由于内容图片都是经过开发者上传到了我们的服务器,因此也避免了截屏时候内容跨域安全问题。另外,为了保证预览图片的高质量和主题包的体积小,我们使用jpeg格式,采用.75的质量比例,示例代码截图如下:

应用四:形状截取

手机APP的icon颜色形状都设计的各不相同,为了保证桌面的整体美观协调,Flyme系统为第三方图标提供了可以应用默认形状的机制,使用后,第三方icon会被默认的形状截取,整体上保证了桌面的美观。

通过设置canvas global属性globalCompositeOperation值为destination-in,我们在Canvas上预览也达到同样的效果,该属性还提供了其他的可选值对应不同的截取方式,不一一列举。示例代码和效果图如下(以QQ和微博icon为例):

结语

以上便是Canvas在Flyme主题在线编辑工具中的应用分享。我们可以看到Canvas完成了很多传统web方式较难实现或不能实现的需求,或者在对比传统web方式上,更高效、便捷,应用下来感觉非常方便。

当然,Canvas功能强大远不止如此,在该项目中我们也计划后续更多的尝试应用Canvas来解决更多需求,例如使用Canvas动画来完成手机动态壁纸的预览以及手机各操作页面的动画,期待Canvas给我们带来更多惊喜!

Canvas在Flyme主题的应用实践相关推荐

  1. Canvas做股票数据走势图实践分享(一)

    Canvas做股票数据走势图实践分享(一) 转载于:https://www.cnblogs.com/zhujiabin/p/4774142.html

  2. 主题 12:实践案例集锦之兜底方案设计

    1. 引言 惟事事,乃其有备,有备无患--<尚书·说命中> 在<主题 02:如何设计系统预案?>一文中,笔者以三个 W(什么是预案?为什么要做预案?如何设计预案?)为主线展开, ...

  3. 主题 12:实践案例集锦之接口设计

    1. 引言 API 是模块或者子系统之间交互的桥梁,好的系统架构离不开好的 API 设计.在<主题 1:如何设计一个好的 API>一文中,笔者解读了什么样的 API 设计是好的设计,本文作 ...

  4. MQTT Part 5 主题和最佳实践

    主题 主题是一个UTF-8字符串,代理用它来过滤每个连接的客户端的消息. 主题由一个或多个主题级别组成. 每个主题级别之间由正斜杠(主题级别分隔符)分隔. 与消息队列相比,主题非常轻量级. 客户端不需 ...

  5. Vue + 原生Canvas实现生成电子证书的实践

    上次写完笔记后发现还是挺有用的,就考虑以后还是继续不定期记录一下,复盘之前开发过程中的思路并激发一些新的灵感,还是蛮不错的. 这次要记录的是之前做过的一个电子证书的小功能.需求非常非常简单,只需要把背 ...

  6. 主题 12:实践案例集锦之设计理念

    1. 引言 古语云:道为术之灵,术为道之体:以道统术,以术得道. 其中:"道"指"规律.道理.理论","术"指"方法.技巧.技术& ...

  7. 高职计算机应用与信息检索,高职计算机应用主题式教学模式实践

    高职计算机应用主题式教学模式实践 主题教学模式就是将教学内容主 题化,按照主题组织教学活动的教学模式.计算机应用基础教学中的主题教学模式实践中,主题设计要有真实性.层次性.开放性.下面是小编搜集整理的 ...

  8. Docker实践,来自沪江、滴滴、蘑菇街架构师的交流分享

    架构师小组交流会:每期选一个时下最热门的技术话题进行实践经验分享. 第一期主题:容器实践.Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是CI/CD,DevOps,微服务的重要 ...

  9. 探索多媒体开发最新最佳实践,我们在深圳等你

    2018年初始,音视频技术生态并不平静,Codec争夺愈加激烈,新一代标准的挑战一浪高过一浪:WebRTC的定版也为打通浏览器.移动端乃至IoT带来了机会:此外AI.区块链技术的兴起,催化着与多媒体领 ...

最新文章

  1. jquery获取对象
  2. 「图解」ThreadLocal 在并发问题中的应用
  3. java代码混淆框架_Android常用框架混淆代码
  4. 关于数据中心的选址大全
  5. 1251: 字母图形 [水题]
  6. xss跨站脚本攻击_网络安全xss跨站脚本攻击原理
  7. bzoj2503poj3387[NEERC2006]IdealFrame
  8. 报错日常——Tomcat45秒超时问题
  9. SPGridview的使用
  10. 架构之重构的12条军规(上)
  11. 协程asyncio_迭代器,生成器,协程
  12. 谷歌卫星地图下载助手
  13. Java开发的文字RPG游戏,代码开源
  14. 结构化、半结构化、非结构化的理解
  15. 计算机网络中的基本器件(网卡,集线器,交换机,路由器)
  16. OpenCvSharp函数:Dilate膨胀、GetStructuringElement获取形态操作的结构元素、Erode腐蚀
  17. layui 表格数据源_学习数据分析,这些超好用的数据分析工具你必须知道!|数据挖掘|数据源|oracle...
  18. 国威电话交换机如何设置加拨17909IP功能
  19. TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)
  20. java中的消息队列

热门文章

  1. 博途PLC 1200/1500PLC ModbusTcp通信之状态机编程
  2. c++的3D游戏笔录-基于panda3d(4)
  3. 11 编译2022年最新的Linux kernel 6.1源码,并用QEMU模拟器运行
  4. 安装会声会影2018出现java_会声会影2018正式版图文安装教程
  5. WebAPI接口调试技巧
  6. Basler pylon-ros-camera驱动 Xavier AGX调试记录 (Arm架构)
  7. 社群空间站v3.5.2 微信社群人脉系统社群空间站PHP源码
  8. NTP时间服务器部署以及时间同步设置
  9. python爬取搜狗图片
  10. 基于Java+Swing实现推箱子游戏