第85篇 webrtc一对一研究(十三)

关键词:白板铅笔笔迹同步过程,打开房间,同步机制,获取图像base64

一、webrtc

1.1 白板铅笔笔迹同步过程

1common.js的作用----------../Help/index.html

  Commontask like output in textarea, global variables/objects etc. have been placed in<a href="../common.js">common.js</a> file.

   这句话表明,common.js放的是全局变量。

2events-handler.js ---------- ../Help/index.html

         <ahref="../events-handler.js">events-handler.js</a> is used tohandle global events like mousemove, mouseup, mousedown and their touchrelevant!

 events-handler.js的作用是:处理全局事件,像鼠标移动、抬起、按下等。

3)做了个精减版,总共65pencil,所剩文件如下:

分别解析如下:

3.1—3.2----------canvas-designer-widget.js

   var tools = {

       line: true,

       arrow: true,

       pencil:true,

       dragSingle: true,

       dragMultiple: true,

       eraser: true,

       rectangle: true,

       arc: true,

       bezier: true,

       quadratic: true,

       text: true,

       image: true,

       marker: true

   };

 

var selectedIcon= 'pencil';

注:这里的pencil是为了选择图标的显示与不显示。

3.3---3.5)----------index.html

注:这三个对应是一个lable和一个checkbox.

3.6—3.7----------index.html

designer.setSelected('pencil');

designer.setTools({

   pencil: true,

   text: true,

   image: true,

   eraser: true,

   line: true,

   arrow: true,

   dragSingle: true,

   dragMultiple: true,

   arc: true,

   rectangle: true,

   quadratic: true,

   bezier: true,

   marker: true,

         zoom:true

});

注:这个确实是控制按钮的显示与否的。设为pencil:false,笔就不显示。

3.8---3.10----------------------------------widget.html

   if (window.selectedIcon) {

           try {

                window.selectedIcon =window.selectedIcon.split('')[0].toUpperCase() +window.selectedIcon.replace(window.selectedIcon.split('').shift(1), '');

           } catch (e) {

                window.selectedIcon = 'Pencil';

           }

       } else {

           window.selectedIcon = 'Pencil';

       }

注:单击选取pencil按钮(有一个pencil-icon所以占一个符号位。)

3.11)----------------------------------widget.js

 

               if (p[0] === 'pencil') {

                    tempArray[i] =['context.beginPath();\n' + 'context.moveTo(' + point[0] + ', ' + point[1] +');\n' + 'context.lineTo(' + point[2] + ', ' + point[3] + ');\n' +this.strokeOrFill(p[2])];

                                     }

 注:这一句好像没什么用,去掉也不影响画笔迹。

3.12)----------------------------------widget.js

        if (p[0] === 'pencil') {

                                               alert('333333333333333333');

                    output +=this.shortenHelper(p[0], [

                        getPoint(point[0], x,'x'),

                       getPoint(point[1], y, 'y'),

                        getPoint(point[2], x,'x'),

                        getPoint(point[3], y,'y')

                    ], p[2]);

                }

注:这一句好像没什么用,去掉也不影响画笔迹。

3.13)----------------------------------widget.js

         if (p[0] === 'pencil') {

                    output +='context.beginPath();\n' + 'context.moveTo(' + getPoint(point[0], x, 'x') + ',' + getPoint(point[1], y, 'y') + ');\n' + 'context.lineTo(' +getPoint(point[2], x, 'x') + ', ' + getPoint(point[3], y, 'y') + ');\n'

 

                    +

                    this.strokeOrFill(p[2]);

                           

                }

注:这一句好像没什么用,去掉也不影响画笔迹。

 

3.14)

 能console.log出来的地方如下:

注:虽说知道了怎么传值,但现在还不知道怎么同步数据,感觉还是方向不对。下一步从打开房间,建立连接通道着手。

1.2 打开房间,同步机制

1 打开房间,上来一个按钮如下:

<buttonid="open-room">Open</button>

与这个id相关的点击事件如下:

document.getElementById('open-room').οnclick= function() {

   var roomid = document.getElementById('room-id').value;

   if(!roomid.length) return alert('Please enter roomid.');

 

   this.disabled = true;

 

   connection.open(roomid);

 

   this.parentNode.innerHTML = '<a href="#' + roomid + '"target="_blank">Please share this link</a>';

};

2上述程序中有一句 connection.open(roomid);,它就是建立连接通道用的,解析如下:

 a)连接的初始化

var connection = new RTCMultiConnection();

 b)传递消息

connection.socketMessageEvent = 'canvas-designer';

c) 控制同步时间的代码如下:----index.html

   if(designer.pointsLength <= 0) {

       // make sure that remote user gets all drawings synced.

       setTimeout(function() {

           connection.send('plz-sync-points');

       }, 1000);

    }

 由上述代码可知,1秒钟同步一次,经测试确实如此(1000--->120000之后,就变成2分钟同步一次啦。)

d)数据同步函数如下:-----------------index.html

var designer = new CanvasDesigner();

 

// you can place widget.html anywhere

designer.widgetHTML = 'widget.html';

designer.widgetJsURL = 'widget.min.js'

 

designer.addSyncListener(function(data) {

    connection.send(data);

});

注:如果把程序中connection.send(data);注释掉,数据将同步不过去。

e) 对于追加笔迹,同步方法如下:

Array.prototype.slice.call(document.getElementById('action-controls').querySelectorAll('input[type=checkbox]')).forEach(function(checkbox){

   checkbox.onchange = function() {

       designer.destroy();

 

       designer.addSyncListener(function(data) {

           connection.send(data);

       });

 

       var tools = {};

       Array.prototype.slice.call(document.getElementById('action-controls').querySelectorAll('input[type=checkbox]')).forEach(function(checkbox2){

           if(checkbox2.checked) {

                tools[checkbox2.id] = true;

           }

       });

       designer.setTools(tools);

       designer.appendTo(document.getElementById('widget-container'));

   };

});

1.3 做一个获取图像base64位按钮,加深图像传输过程

1)做按钮

<button id="btn-getDataURL1"style="float:right;">Get DataURL1</button>

2)加样式

#btn-undo, #btn-close-undo-popup,#btn-close-dataURL-popup, #btn-getDataURL,#btn-getDataURL1{

   font-size: 1.2em;

   padding: 2px 9px;

}

3)加单击函数

document.getElementById('btn-getDataURL1').onclick = function() {

   var format = dataURLFormat.value;

 

    designer.toDataURL1(format|| 'image/png', function(dataURL1) {

      window.open(dataURL1);

 

                             linkToImage.style = 'margin-left:10px;display: block;text-align: center;margin-bottom: -50px;';

                             linkToImage.href = dataURL1;

                             linkToImage.innerHTML = 'Click to DownloadImage';

                             linkToImage.download = 'image.' + (format ||'image/png').split('/')[1];

   });

 

   // closeDataURLPopup();

};

4)定义上述的designer.toDataURL1函数:

         designer.toDataURL1= function(format, callback) {

       dataURLListener = callback;

 

       if (!designer.iframe) return;

       designer.postMessage1({

           genDataURL: true,

           format: format

       });

   };

5)定义上述的designer.postMessage1函数

   designer.postMessage1 = function(message) {

       if (!designer.iframe) return;

 

       message.uid = designer.uid;

       designer.iframe.contentWindow.postMessage(message, '*');

};

2016年10月31日星期一


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值