zoukankan      html  css  js  c++  java
  • [读码]HTML5像素文字爆炸重组

    【边读码,边学习,技术也好,思路也罢】

    【一款基于HTML5技术的文字像素爆炸重组动画特效,我们可以在输入框中指定任意文字,点击确定按钮后,就会将原先的文字爆炸散去,新的文字以像素点的形式组合起来,看起来非常棒。】

    一开始想着,怎么在一个Canvas里获取文字的像素点位置。
    还是说,有专门的Api获取文字的位置。
    结果看了代码才发现,原来是用了那么个巧妙的办法[巧妙而超级简单]。
    也就是说,所有的图片,都可以动态的用点来画出来了。
    虽然说,扫描canvas的做法效率不高,但是似乎也只能这样了。


    ---
    大致实现方法如下:
    1.放两个canva,一个用于放置背景以及动态像素点[背景Canvas],另一个不可见的用于画文字[文字Canvas]
    2.[背景Canvas]里生成像素圆点小球,使其自由移动。
    3.当点击按钮时,先在[文字Canvas]里画上相应的文字。然后扫描[文字Canvas]里的像素,有内容的话,就将该位置指定给像素小球。
    4.使用动画,移动小球到指定位置[需要flg来表明状态吧]
    ---
    使用js库:
    1.EasePack[渐变效果用]
    2.TweenLite[渐变用]
    3.easeljs
    [Useful for creating games, generative art, and other highly graphical experiences.]

    以上插件都整合在CreateJs里
    http://createjs.com/
    ---
    关键代码段:

    1.创建[背景Canvas],[文字Canvas],[动态文本],[像素圆点]

    1 textStage = new createjs.Stage("text");
    2 stage = new createjs.Stage("stage");
    3 text = new createjs.Text("t", "80px 'Source Sans Pro'", "#eee");
    4 circle = new createjs.Shape();

    2.移动像素点计算

     1 // c-元素点对象,dir-方向,in:向字聚集,out:打散
     2 // movement-jiggle:快速抖动,float:缓慢移动
     3 function tweenCircle(c, dir) {
     4     if(c.tween) c.tween.kill();
     5     if(dir == 'in') {
     6     //向字聚集
     7         c.tween = TweenLite.to(c, 0.4, {x: c.originX, y: c.originY, ease:Quad.easeInOut, alpha: 1, radius: 5, scaleX: 0.4, scaleY: 0.4, onComplete: function() {
     8         c.movement = 'jiggle';
     9         tweenCircle(c);
    10         }});
    11     } else if(dir == 'out') {
    12     //打散
    13         c.tween = TweenLite.to(c, 0.8, {x: window.innerWidth*Math.random(), y: window.innerHeight*Math.random(), ease:Quad.easeInOut, alpha: 0.2 + Math.random()*0.5, scaleX: 1, scaleY: 1, onComplete: function() {
    14         c.movement = 'float';
    15         tweenCircle(c);
    16         }});
    17     } else {
    18         if(c.movement == 'float') {
    19         //打散状态下的缓慢移动
    20         c.tween = TweenLite.to(c, 5 + Math.random()*3.5, {x: c.x + -100+Math.random()*200, y: c.y + -100+Math.random()*200, ease:Quad.easeInOut, alpha: 0.2 + Math.random()*0.5,
    21             onComplete: function() {
    22             tweenCircle(c);
    23             }});
    24         } else {
    25         //聚集状态下的快速抖动
    26         c.tween = TweenLite.to(c, 0.05, {x: c.originX + Math.random()*3, y: c.originY + Math.random()*3, ease:Quad.easeInOut,
    27             onComplete: function() {
    28             tweenCircle(c);
    29             }});
    30         }
    31     }
    32 }

    3.创建文字,并扫描文字位置

     1 //text配置后,画到canvas
     2 textStage.addChild(text);
     3 textStage.update();
     4 //获取[文字Canvas]像素列表
     5 var ctx = document.getElementById('text').getContext('2d');
     6 var pix = ctx.getImageData(0,0,600,200).data;
     7 //获取的像素是RGBA4个表示一个像素点
     8 textPixels = [];
     9 for (var i = pix.length; i >= 0; i -= 4) {
    10     if (pix[i] != 0) {
    11     var x = (i / 4) % 600; // x轴位置,%600(行宽):用于计算多行
    12     var y = Math.floor(Math.floor(i/600)/4); // Y轴位置
    13     //下面的代码,各像素圆点之间的距离为8
    14     if((x && x%8 == 0) && (y && y%8 == 0)) textPixels.push({x: x, y: y});
    15     }
    16 }

    4.赋值给像素圆点

     1 for(var i= 0, l=textPixels.length; i<l; i++) {
     2     circles[i].originX = offsetX + textPixels[i].x;
     3     circles[i].originY = offsetY + textPixels[i].y;
     4     tweenCircle(circles[i], 'in');
     5 }
     6 textFormed = true; // 是否已形成文字Flg
     7 //处理多余像素圆点,但是如果文字需要的像素圆点过多,会如何只有一半文字了吧。。。
     8 if(textPixels.length < circles.length) {
     9     for(var j = textPixels.length; j<circles.length; j++) {
    10     circles[j].tween = TweenLite.to(circles[j], 0.4, {alpha: 0.1});
    11     }
    12 }

    5.文字爆炸效果

    1 for(var i= 0, l=textPixels.length; i<l; i++) {
    2     tweenCircle(circles[i], 'out');
    3 }
    4 if(textPixels.length < circles.length) {
    5     for(var j = textPixels.length; j<circles.length; j++) {
    6     circles[j].tween = TweenLite.to(circles[j], 0.4, {alpha: 1});
    7     }
    8 }

    ----

    源码地址:
    http://www.html5tricks.com/download/html5-text-pixel.rar

    演示地址:
    http://www.html5tricks.com/demo/html5-text-pixel/index.html

    ---

    如果此效果用来显示图片,岂不更好玩。。。
    似乎可以制作印象派作品了,哪天试试

  • 相关阅读:
    小程序mpvue使用scroll-view
    mysql之join浅析
    YApi-v1.9.2部署失败(Accessing non-existent property 'count' of module exports inside circular dependency)的解决方案
    YApi 可视化部署时遇到9090端口被占用时的解决方案
    [转载]最近涉及字符串列表存储,为加快检索速度,搜集了一些哈希函数,C语言的代码保存见内
    字符串的编码检测
    mbcs、unicode,UTF-8、UTF-16等的转换
    支持多重结构的配置信息读取代码,基于VS2008
    配置信息读取代码(VS2012编译通过,使用了C++11特性)
    [转载]TCPMP0.72RC1的编译与移植以及自己另外做UI完整方法
  • 原文地址:https://www.cnblogs.com/wangxinsheng/p/4384248.html
Copyright © 2011-2022 走看看