Canvas在头条wap中的应用

shellzhang

2014-12-07

wap版头条的下拉刷新

  • 之前的版本,需要整体移动内容区域——在低配手机上,存在下拉卡顿的现象。
  • 做了相应优化,但效果不甚满意
  • 其结果会导致用户下拉刷新的欲望减弱,进而会影响广告的投放效果

新版下拉刷新

 

采用Android上新版Google Gmail的下拉刷新的实现方式

实现方案选型 Canvas or SVG

  • 此次主要考虑开发成本
    • Canvas接口更简单
    • 在绘制大小渐变的带箭头圆弧上,SVG需要操作的属性更复杂

绘图方法介绍

  • Canvas API
    • context = canvas.getContext('2d')
    • context.arc
      • X
      • Y
      • Radius
      • startAngle
      • endAngle
      • isCounterClockwise

绘图方法介绍(二)

绘图方法介绍(三)

绘图方法介绍(四)

  • 绘制后擦除
    • source-out & destination out(用于擦除)

那些年,我们一起爬过的坑

  • 圆弧绘制中遇到锯齿
    • 原因是每次都是从起点画起,重叠部分出现了锯齿边
    • 采用每次画前clearRect清屏,再画
    • 但仍然不理想
    • 最后采取手段是
      • 用较大长宽的Canvas画图,并用样式缩小到合适比例
      • 200*200的区域,画100半径的园,然后缩小到40px

那些年,我们一起爬过的坑(二)

  • 向后兼容,优雅降级
    • 对Canvas不支持或者支持不好的,采用图片+css3

改进后的效果

drag_refresh

click_refresh

后续的优化与改进

  • SVG?
    • 此次技术选型没有从性能方面考量Canvas和SVG
    • 后续可以尝试做一套SVG版本的
  • 采用离屏Canvas进行预渲染
    • 即将圆弧先绘制到一个离屏Canvas,然后通过DrawImage的调用把离屏Canvas的内容绘制到主Canvas中。以达到尽量减少Canvas API的调用

源码地址

  • ss_site/webroot/js/lib/pull2refresh_v2.js
  • ss_site/webroot/js/lib/touchPull.js
  • ss_site/webroot/js/lib/canvasUtils.js

Thanks!

Canvas在头条wap中的应用

By shellzhang

Canvas在头条wap中的应用

A slider show how canvas-based loading module is used in m.toutiao.com

  • 1,279