日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

canvas图形编辑器

發(fā)布時(shí)間:2023/12/2 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 canvas图形编辑器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??原文地址:http://jeffzhong.space/2017/11/02/drawboard/
??使用canvas進(jìn)行開發(fā)項(xiàng)目,我們離不開各種線段,曲線,圖形,但每次都必須用代碼一步一步去實(shí)現(xiàn),顯得非常麻煩。有沒有一種類似于PS,CAD之類的可視化工具,繪制出基本的圖形,然后輸出代碼。之后我們就可以在這個(gè)生成的圖形場景的基礎(chǔ)上去實(shí)現(xiàn)功能,那將是多么的美妙的事啊。話不多說,我們來實(shí)現(xiàn)一個(gè)圖形編輯器吧?。

主要實(shí)現(xiàn)如下的功能:

  • 直線(實(shí)線、虛線)
  • 貝塞爾曲線(2次,3次)
  • 多邊形(三角形、矩形、任意邊形)
  • 多角星(3角星、4角星、5角星...)
  • 圓形、橢圓
  • 實(shí)際效果: drawboard(推薦在chrome或safari下運(yùn)行)

    功能點(diǎn)包括:

  • 所有的圖形都可以拖拽位置,直線和曲線需要拖拽中點(diǎn)(黃色圓點(diǎn)),其他圖形只需要把鼠標(biāo)放于圖形內(nèi)部拖拽即可;
  • 所有的圖形只要把鼠標(biāo)放于中心點(diǎn)或圖形內(nèi)部,然后按delete鍵即可刪除;
  • 線段可以實(shí)現(xiàn)拉伸減少長度,旋轉(zhuǎn)角度;
  • 貝塞爾曲線可以通過拖拽控制點(diǎn)實(shí)現(xiàn)任意形狀的變化;
  • 多邊形可以拖拽控制點(diǎn)控制多邊形的旋轉(zhuǎn)角度和大小變化,所有頂點(diǎn)都可以拖拽;
  • 多角星除了多邊形的功能外,拖拽第二控制點(diǎn)可以實(shí)現(xiàn)圖形的飽滿程度;
  • 是否填充圖形,是否顯示控制線,是否顯示背景格;
  • 生成代碼。
  • 使用方式:

  • 選中工具欄中的圖形選項(xiàng),是否填充,顏色等,然后在畫板拖動鼠標(biāo),同時(shí)選中的工具欄中的選項(xiàng)復(fù)位,此時(shí)為繪圖模式;
  • 完成繪制圖形后,可以對圖形進(jìn)行拖拽位置,變換頂點(diǎn),旋轉(zhuǎn)等,此時(shí)為修改模式;
  • 然后再選中工具欄選項(xiàng),再次繪制,如此類推;
  • 可以消除控制線和背景格,查看效果,然后可以點(diǎn)擊生成代碼,復(fù)制代碼即可。
  • 該項(xiàng)目用到的知識點(diǎn)包括:

  • ES6面向?qū)ο?/li>
  • html5標(biāo)簽,布局
  • 基本的三角函數(shù)
  • canvas部分有:坐標(biāo)變換,漸變,混合模式,線條和圖形的繪制。
  • 工具欄


    ??首先我們實(shí)現(xiàn)如圖所示的工具欄,也就是基本的html/css,使用了flex布局,同時(shí)使用了html5的color, range, number標(biāo)簽,其它都是普通的html和css代碼。主要注意的地方就是如下用純css實(shí)現(xiàn)選擇效果

    .wrap [type=radio]{position: absolute;top: 0;left: 0;width: 100%;height: 100%;z-index: 99;opacity: 0;cursor: pointer;}.wrap [type=radio]:checked~.label{/* 覆蓋radio */background: hsl(200, 100%, 40%);color: hsl(0, 0%, 100%)}

    ??其中多邊形邊數(shù)選擇范圍控制為:3-20,當(dāng)然我們也可以擴(kuò)大為無限大的邊數(shù),但實(shí)際應(yīng)用到的情況比較少。多角星情況類型,范圍控制為3~20。

    ??然后對線條粗細(xì),描邊顏色,填充顏色顯示信息,也就是onchang事件觸發(fā)時(shí)獲取value值,再顯示出來。顯示鼠標(biāo)當(dāng)前的位置功能也非常簡單,在此也略過不表。

    圖形基類

    ??開始實(shí)現(xiàn)畫板的功能,第一步,實(shí)現(xiàn)圖形基類,這個(gè)是最重要的部分。因?yàn)椴还苁蔷€條,多邊形都會繼承該類。
    ??注意:isPointInPath非常有用,就是這個(gè)api實(shí)現(xiàn)鼠標(biāo)是否選中的功能了,它的原理就是調(diào)用上下文context繪制路徑,然后向isPointInPath傳遞位置(x,y)信息,該api會返回這個(gè)點(diǎn)是否在繪制路徑上,相當(dāng)于繪制的是隱形的路徑進(jìn)行判斷點(diǎn)是否在該路徑或圖形內(nèi)部,這也是我要把繪制路徑和渲染的功能分離開的原因。

    ??具體的功能還是直接看代碼吧

    class Graph{//初始化圖形需要用到的屬性,位置,頂點(diǎn)列表,邊的寬度,描邊顏色,填充顏色,是否填充;constructor(pos){this.x=pos.x;this.y=pos.y;this.points=[];this.sides=5;this.stars=5;this.lineWidth=1;this.strokeStyle='#f00';this.fillStyle='#f00';this.isFill=false;}//實(shí)現(xiàn)繪制時(shí)的拖拽initUpdate(start,end){this.points[1]=end;this.x=(start.x end.x)/2;this.y=(start.y end.y)/2;}//實(shí)現(xiàn)修改模式下的拖拽頂點(diǎn)和控制點(diǎn)update(i,pos){if(i==9999){var that=this,x1=pos.x-this.x,y1=pos.y-this.y;this.points.forEach((p,i)=>{that.points[i]={x:p.x x1, y:p.y y1 };});this.x=Math.round(pos.x);this.y=Math.round(pos.y);} else {this.points[i]=pos;var x=0,y=0;this.points.forEach(p=>{x =p.x;y =p.y;});this.x=Math.round(x/this.points.length);this.y=Math.round(y/this.points.length);}}//繪制路徑createPath(ctx){ctx.beginPath();this.points.forEach((p,i)=>{ctx[i==0?'moveTo':'lineTo'](p.x,p.y);});ctx.closePath();}//判斷鼠標(biāo)是否選中對應(yīng)的圖形,選中哪個(gè)頂點(diǎn),選中哪個(gè)控制點(diǎn),中心點(diǎn);isInPath(ctx,pos){for(var i=0,point,len=this.points.length;i<len;i ){point=this.points[i];ctx.beginPath();ctx.arc(point.x,point.y,5,0,Math.PI*2,false);if(ctx.isPointInPath(pos.x,pos.y)){return i;}}this.createPath(ctx);if(ctx.isPointInPath(pos.x,pos.y)){return 9999;}return -1}//繪制控制點(diǎn)drawController(ctx){this.drawPoints(ctx);this.drawCenter(ctx);}//繪制頂點(diǎn)drawPoints(){ctx.save();ctx.lineWidth=2;ctx.strokeStyle='#999';this.points.forEach(p=>{ctx.beginPath();ctx.arc(p.x,p.y,5,0,Math.PI*2,false);ctx.stroke();});ctx.restore();}//繪制中心點(diǎn)drawCenter(ctx){ctx.save();ctx.lineWidth=1;ctx.strokeStyle='hsla(60,100%,45%,1)';ctx.fillStyle='hsla(60,100%,50%,1)';ctx.beginPath();ctx.arc(this.x,this.y,5,0,Math.PI*2,false);ctx.stroke();ctx.fill();ctx.restore();}//繪制整個(gè)圖形draw(ctx){ctx.save();ctx.lineWidth=this.lineWidth;ctx.strokeStyle=this.strokeStyle;ctx.fillStyle=this.fillStyle;this.createPath(ctx);ctx.stroke();if(this.isFill){ ctx.fill(); }ctx.restore();}//生成代碼createCode(){var codes=['// ' this.name];codes.push('ctx.save();');codes.push('ctx.lineWidth=' this.lineWidth);codes.push('ctx.strokeStyle=\'' this.strokeStyle '\';');if(this.isFill){codes.push('ctx.fillStyle=\'' this.fillStyle '\';');}codes.push('ctx.beginPath();');codes.push('ctx.translate(' this.x ',' this.y ');')//translate到中心點(diǎn),方便使用this.points.forEach((p,i)=>{if(i==0){codes.push('ctx.moveTo(' (p.x-this.x) ',' (p.y-this.y) ');');// codes.push('ctx.moveTo(' (p.x) ',' (p.y) ');');} else {codes.push('ctx.lineTo(' (p.x-this.x) ',' (p.y-this.y) ');');// codes.push('ctx.lineTo(' (p.x) ',' (p.y) ');');}});codes.push('ctx.closePath();');codes.push('ctx.stroke();');if(this.isFill){codes.push('ctx.fill();');}codes.push('ctx.restore();');return codes.join('\n');}}

    直線


    ??實(shí)現(xiàn)直線功能相當(dāng)簡單,繼承基類,只需要重寫draw和createCode方法,拖拽和變換等功能都已經(jīng)在基類實(shí)現(xiàn)了。

    class Line extends Graph{constructor(pos){super(pos);this.points=[pos,pos];this.name='直線'}createPath(ctx){ctx.beginPath();ctx.arc(this.x,this.y,5,0,Math.PI*2,false);}draw(ctx){ctx.save();ctx.lineWidth=this.lineWidth;ctx.strokeStyle=this.strokeStyle;ctx.beginPath();this.points.forEach((p,i)=>{if(i==0){ctx.moveTo(p.x,p.y);} else {ctx.lineTo(p.x,p.y);}});ctx.closePath();ctx.stroke();ctx.restore();}createCode(){var codes=['// ' this.name];codes.push('ctx.lineWidth=' this.lineWidth);codes.push('ctx.strokeStyle=\'' this.strokeStyle '\';');codes.push('ctx.beginPath();');this.points.forEach((p,i)=>{if(i==0){codes.push('ctx.moveTo(' p.x ',' p.y ');');} else {codes.push('ctx.lineTo(' p.x ',' p.y ');');}});codes.push('ctx.closePath();');codes.push('ctx.stroke();');return codes.join('\n');}}

    ??還有就是虛線功能了,其實(shí)就是先繪制一段直線,然后空出一段空間,接著再繪制一段直線,如此類推。小伙伴可以思考一下怎么實(shí)現(xiàn),這個(gè)和直線所涉及的知識點(diǎn)相同,代碼就略過了。

    貝塞爾曲線


    ??接著就是貝塞爾曲線的繪制了,首先繼承直線類,曲線比直線不同的是除了起始點(diǎn)和結(jié)束點(diǎn),它還多出了控制點(diǎn),2次貝塞爾曲線有一個(gè)控制點(diǎn),3次貝塞爾曲線則有兩個(gè)控制點(diǎn)。所以對應(yīng)初始化拖拽,頂點(diǎn)繪制的方法必須重寫,以下是3次貝塞爾曲線的代碼。

    class Bezier extends Line {constructor(pos){super(pos);this.points=[pos,pos,pos,pos];this.name='三次貝塞爾曲線'}initUpdate(start,end){var a=Math.round(Math.sqrt(Math.pow(end.x-start.x,2) Math.pow(end.y-start.y,2)))/2,x1=start.x (end.x-start.x)/2,y1=start.y-a,y2=end.y a;this.points[1]={x:end.x,y:end.y};this.points[2]={x:x1,y:y1<0?0:y1};this.points[3]={x:start.x,y:end.y};this.points[3]={x:x1,y:y2>H?H:y2};this.x=(start.x end.x)/2;this.y=(start.y end.y)/2;}drawPoints(ctx){ctx.lineWidth=0.5;ctx.strokeStyle='#00f';//畫控制點(diǎn)的連線ctx.beginPath();ctx.moveTo(this.points[0].x, this.points[0].y);ctx.lineTo(this.points[2].x, this.points[2].y);ctx.moveTo(this.points[1].x, this.points[1].y);ctx.lineTo(this.points[3].x, this.points[3].y);ctx.stroke();//畫連接點(diǎn)和控制點(diǎn)this.points.forEach(function(point,i){ctx.beginPath();ctx.arc(point.x,point.y,5,0,Math.PI*2,false);ctx.stroke();});}draw(){ctx.save();ctx.lineWidth=this.lineWidth;ctx.strokeStyle=this.strokeStyle;ctx.beginPath();ctx.moveTo(this.points[0].x, this.points[0].y);ctx.bezierCurveTo(this.points[2].x,this.points[2].y,this.points[3].x,this.points[3].y,this.points[1].x,this.points[1].y);ctx.stroke();ctx.restore();}createCode(){var codes=['// ' this.name];codes.push('ctx.lineWidth=' this.lineWidth);codes.push('ctx.strokeStyle=\'' this.strokeStyle '\';');codes.push('ctx.beginPath();');codes.push(`ctx.moveTo(${this.points[0].x},${this.points[0].y});`);codes.push(`ctx.bezierCurveTo(${this.points[2].x},${this.points[2].y},${this.points[3].x},${this.points[3].y},${this.points[1].x},${this.points[1].y});`);codes.push('ctx.stroke();');return codes.join('\n');}}

    至于貝塞爾2次曲線功能類似,同時(shí)也更加簡單,代碼也略過。

    多邊形


    ??實(shí)現(xiàn)任意條邊的多邊形,大家思考一下都會知道如何實(shí)現(xiàn),平均角度=360度/邊數(shù),不是嗎?

    ??在知道中點(diǎn)和第一個(gè)頂點(diǎn)的情況下,第n個(gè)頂點(diǎn)與中點(diǎn)的角度 = n*平均角度;然后記錄下每個(gè)頂點(diǎn)的位置,然后依次繪制每個(gè)頂點(diǎn)的連線即可。這里用到了二維旋轉(zhuǎn)的公式,也就是繞圖形的中點(diǎn),旋轉(zhuǎn)一定的角度。

    既然我們已經(jīng)記錄了每個(gè)頂點(diǎn)的位置,當(dāng)拖動對應(yīng)的頂點(diǎn)后修改該頂點(diǎn)位置,重新繪制,就可以伸縮成任意的圖案。

    ??難點(diǎn)是拖拽控制線,實(shí)現(xiàn)旋轉(zhuǎn)多邊形角度,和擴(kuò)大縮小多邊形。等比例擴(kuò)大縮小每個(gè)頂點(diǎn)與中點(diǎn)的距離即可實(shí)現(xiàn)等比例縮放多邊形,記錄第一個(gè)頂點(diǎn)與中點(diǎn)的角度變化即可實(shí)現(xiàn)旋轉(zhuǎn)功能,這里用到反正切Math.atan2(y,x)求角度;具體實(shí)現(xiàn)看如下代碼。

    /*** 多邊形*/class Polygon extends Graph{constructor(pos){super(pos);this.cPoints=[];}get name(){return this.sides '邊形';}//生成頂點(diǎn)createPoints(start,end){var x1 = end.x - start.x,y1 = end.y - start.y,angle=0;this.points=[];for(var i=0;i<this.sides;i ){angle=2*Math.PI/this.sides*i;var sin=Math.sin(angle),cos=Math.cos(angle),newX = x1*cos - y1*sin,newY = y1*cos x1*sin;this.points.push({x:Math.round(start.x newX),y:Math.round(start.y newY)});}}//生成控制點(diǎn)createControlPoint(start,end,len){var x1 = end.x - start.x,y1 = end.y - start.y,angle=Math.atan2(y1,x1),c=Math.round(Math.sqrt(x1*x1 y1*y1)),l=c (!len?0:c/len),x2 =l * Math.cos(angle) start.x, y2 =l * Math.sin(angle) start.y;return {x:x2,y:y2};}initUpdate(start,end){this.createPoints(start,end);this.cPoints[0]=this.createControlPoint(start,end,3);}//拖拽功能update(i,pos){if(i==10000){//拖拽控制點(diǎn)var point=this.createControlPoint({x:this.x,y:this.y},pos,-4);this.cPoints[0]=pos;this.createPoints({x:this.x,y:this.y},point);} else if(i==9999){ //移動位置var that=this,x1=pos.x-this.x,y1=pos.y-this.y;this.points.forEach((p,i)=>{that.points[i]={x:p.x x1, y:p.y y1 };});this.cPoints.forEach((p,i)=>{that.cPoints[i]={x:p.x x1,y:p.y y1};});this.x=Math.round(pos.x);this.y=Math.round(pos.y);} else {//拖拽頂點(diǎn)this.points[i]=pos;var x=0,y=0;this.points.forEach(p=>{x =p.x;y =p.y;});this.x=Math.round(x/this.points.length);this.y=Math.round(y/this.points.length);}}createCPath(ctx){this.cPoints.forEach(p=>{ctx.beginPath();ctx.arc(p.x,p.y,6,0,Math.PI*2,false);});}isInPath(ctx,pos){var index=super.isInPath(ctx,pos);if(index>-1) return index;this.createCPath(ctx);for(var i=0,len=this.cPoints.length;i<len;i ){var p=this.cPoints[i];ctx.beginPath();ctx.arc(p.x,p.y,6,0,Math.PI*2,false);if(ctx.isPointInPath(pos.x,pos.y)){return 10000 i;break;}}return -1}drawCPoints(ctx){ctx.save();ctx.lineWidth=1;ctx.strokeStyle='hsla(0,0%,50%,1)';ctx.fillStyle='hsla(0,100%,60%,1)';this.cPoints.forEach(p=>{ctx.beginPath();ctx.moveTo(this.x,this.y);ctx.lineTo(p.x,p.y);ctx.stroke();ctx.beginPath();ctx.arc(p.x,p.y,6,0,Math.PI*2,false);ctx.stroke();ctx.fill();});ctx.restore();}drawController(ctx){this.drawPoints(ctx);this.drawCPoints(ctx);this.drawCenter(ctx);}}

    多角星


    ??仔細(xì)思考一下,多角星其實(shí)就是2*n邊形,不過它是凹多邊形而已,于是我們在之前凸多邊形基礎(chǔ)上去實(shí)現(xiàn)。相比于多邊形,我們還要在此基礎(chǔ)上增加第二控制點(diǎn),實(shí)現(xiàn)凹點(diǎn)與凸點(diǎn)的比值變化,通俗點(diǎn)就是多角星的胖瘦度。

    class Star extends Polygon{//增加凹頂點(diǎn)與凸頂點(diǎn)的比例屬性sizeconstructor(pos){super(pos);this.cPoints=[];this.size=0.5;}get name() {return this.stars '角星'}// 增加凹頂點(diǎn)createPoints(start,end){var x1 = end.x - start.x,y1 = end.y - start.y,x2 =x1*this.size,y2 =y1*this.size,angle=0,angle2=0;this.points=[];for(var i=0;i<this.stars;i ){angle=2*Math.PI/this.stars*i;angle2=angle Math.PI/this.stars;var sin=Math.sin(angle),cos=Math.cos(angle),newX = x1*cos - y1*sin,newY = y1*cos x1*sin,sin2=Math.sin(angle2),cos2=Math.cos(angle2),newX2 = x2*cos2 - y2*sin2,newY2 = y2*cos2 x2*sin2;this.points.push({x:Math.round(start.x newX),y:Math.round(start.y newY)});this.points.push({x:Math.round(start.x newX2),y:Math.round(start.y newY2)});}}initUpdate(start,end){this.createPoints(start,end);this.cPoints[0]=this.createControlPoint(start,end,3);this.cPoints[1]=this.createControlPoint(start,this.points[1],3);}update(i,pos){if(i==10000){var ang=Math.PI/this.stars,angle=Math.atan2(pos.y-this.y,pos.x-this.x),sin=Math.sin(ang angle),cos=Math.cos(ang angle),a=Math.sqrt(Math.pow(pos.x-this.x,2) Math.pow(pos.y-this.y,2));this.cPoints[1]={x:(a*this.size 10)*cos this.x, y:(a*this.size 10)*sin this.y };var point=this.createControlPoint({x:this.x,y:this.y},pos,-4);//第一個(gè)頂點(diǎn)坐標(biāo)this.cPoints[0]=pos;//第一個(gè)選擇控制點(diǎn)坐標(biāo)this.createPoints({x:this.x,y:this.y},point);//更新所有頂點(diǎn)} else if(i==10001){var x1 = this.points[1].x - this.x,y1 = this.points[1].y - this.y,angle=Math.atan2(y1,x1),a=Math.sqrt(Math.pow(pos.x-this.x,2) Math.pow(pos.y-this.y,2)),b=Math.sqrt(Math.pow(this.points[0].x-this.x,2) Math.pow(this.points[0].y-this.y,2));var x=a*Math.cos(angle),y=a*Math.sin(angle);this.size=(a-20)/b;this.cPoints[1]={x:this.x x, y:this.y y };this.createPoints({x:this.x,y:this.y},this.points[0]);//更新所有頂點(diǎn)} else {super.update(i,pos);}}}

    三角形,矩形


    ??這兩個(gè)圖形就是特別的多邊形而已,功能非常簡單,而且只需要繼承圖形基類Graph

    /*** 三角形*/class Triangle extends Graph{constructor(pos){super(pos);this.points=[pos,pos,pos];this.name='三角形';}initUpdate(start,end){var x1=Math.round(start.x),y1=Math.round(start.y),x2=Math.round(end.x),y2=Math.round(end.y);this.points[0]={x:x1,y:y1};this.points[1]={x:x1,y:y2};this.points[2]={x:x2,y:y2};this.x=Math.round((x1*2 x2)/3);this.y=Math.round((y2*2 y1)/3);}}/*** 矩形*/class Rect extends Graph{constructor(pos){super(pos);this.points=[pos,pos,pos,pos];this.name='矩形';}initUpdate(start,end){var x1=Math.round(start.x),y1=Math.round(start.y),x2=Math.round(end.x),y2=Math.round(end.y);this.points[0]={x:x1,y:y1};this.points[1]={x:x2,y:y1};this.points[2]={x:x2,y:y2};this.points[3]={x:x1,y:y2};this.x=Math.round((x1 x2)/2);this.y=Math.round((y1 y2)/2);}}

    圓形,橢圓


    ??繪制圓形比較簡單,只需要知道中點(diǎn)和半徑,即可繪制,代碼在此省略。
    ??橢圓的繪制才是比較麻煩的,canvas并沒有提供相關(guān)的api,我這里參考了網(wǎng)上的例子,是使用4條三次貝塞爾曲線首尾相接來實(shí)現(xiàn)的,橢圓有兩個(gè)控制點(diǎn),分別可以拖拽實(shí)現(xiàn)橢圓的壓扁程度。這里只展示部分的代碼,其他和多邊形類似:

    initUpdate(start,end){this.points[0]=end;this.a=Math.round(Math.sqrt(Math.pow(this.points[0].x-start.x,2) Math.pow(this.points[0].y-start.y,2)));this.b=this.a/2;this.angle = Math.atan2(this.points[0].y-this.y,this.points[0].x-this.x);this.rotateA();}update(i,pos){if(i==9999){var that=this,x1=pos.x-this.x,y1=pos.y-this.y;this.points.forEach((p,i)=>{that.points[i]={x:p.x x1, y:p.y y1 };});this.x=pos.x;this.y=pos.y;} else {this.points[i]=pos;if(i==0){this.a=Math.round(Math.sqrt(Math.pow(this.points[0].x-this.x,2) Math.pow(this.points[0].y-this.y,2)));this.angle = Math.atan2(this.points[0].y-this.y,this.points[0].x-this.x);this.rotateA();} else if(i==1){this.b=Math.round(Math.sqrt(Math.pow(this.points[1].x-this.x,2) Math.pow(this.points[1].y-this.y,2)));this.angle = Math.PI/2 Math.atan2(this.points[1].y-this.y,this.points[1].x-this.x);this.rotateB();}}}createPath(ctx){var k = .5522848,x=0, y=0,a=this.a, b=this.b,ox = a * k, // 水平控制點(diǎn)偏移量oy = b * k; // 垂直控制點(diǎn)偏移量ctx.beginPath();//從橢圓的左端點(diǎn)開始順時(shí)針繪制四條三次貝塞爾曲線ctx.moveTo(x - a, y);ctx.bezierCurveTo(x - a, y - oy, x - ox, y - b, x, y - b);ctx.bezierCurveTo(x ox, y - b, x a, y - oy, x a, y);ctx.bezierCurveTo(x a, y oy, x ox, y b, x, y b);ctx.bezierCurveTo(x - ox, y b, x - a, y oy, x - a, y);ctx.closePath();}

    事件部分

    ??繪圖的主體部分已經(jīng)完成,接下來就是定義相關(guān)的事件了,首先mousedown的時(shí)候記錄下第一個(gè)坐標(biāo)mouseStart,這個(gè)點(diǎn)是繪制直線和曲線的起始點(diǎn),同時(shí)也是多邊形和多角星的中點(diǎn);

    ??然后再定義mousemove事件,記錄下第二個(gè)坐標(biāo)mouseEnd,這個(gè)是繪制直線和曲線的結(jié)束點(diǎn),同時(shí)也是多邊形和多角星的第一個(gè)頂點(diǎn);

    ??當(dāng)然這中間還要區(qū)分繪制模式和修改模式,繪制模式下,根據(jù)類型從對象工廠獲取對應(yīng)的對象,然后設(shè)置對象的屬性,完成初始化之后就把圖形對象放入圖形列表shapes中。列表中的圖形對象就可以作為后續(xù)修改模式進(jìn)行應(yīng)用動畫。

    ??如果是修改模式的話,首先是遍歷shapes中所有的圖形對象,并依次調(diào)用isInPath方法,看看當(dāng)前的鼠標(biāo)位置是否在該圖形上,并判斷是在中點(diǎn)或圖形內(nèi)部,還是某個(gè)頂點(diǎn)上。而具體的判斷邏輯已經(jīng)控制反轉(zhuǎn)在圖形對象內(nèi)部,外部并不需要知道其實(shí)現(xiàn)原理。如果鼠標(biāo)落在了某個(gè)圖形對象上,則在鼠標(biāo)移動時(shí)實(shí)時(shí)更新該圖形對應(yīng)的位置,頂點(diǎn),控制點(diǎn),并同步動畫渲染該圖形。

    ??刪除功能的實(shí)現(xiàn),就是按下delete鍵時(shí),遍歷shapes中所有的圖形對象,并依次調(diào)用isInPath方法,鼠標(biāo)如果在該對象上面,直接在shapes數(shù)組上splice(i,1),然后重寫渲染就ok。

    ??生成代碼功能一樣,遍歷shapes,依次調(diào)用createCode方法獲取該圖形生成的代碼字符串,然后將所有值合并賦予textarea的value。

    ??這里要理解的是,只要啟動了對應(yīng)的模式,改變了圖形的某部分,背景和對應(yīng)所有的圖形都要重新繪制一遍,當(dāng)然這也是canvas這種比較底層的繪圖api實(shí)現(xiàn)動畫的方式了。

    // 生成對應(yīng)圖形的對象工廠function factory(type,pos){switch(type){case 'line': return new Line(pos);case 'dash': return new Dash(pos);case 'quadratic': return new Quadratic(pos);case 'bezier': return new Bezier(pos);case 'triangle': return new Triangle(pos);case 'rect': return new Rect(pos);case 'round': return new Round(pos);case 'polygon': return new Polygon(pos);case 'star': return new Star(pos);case 'ellipse': return new Ellipse(pos);default:return new Line(pos);}}canvas.addEventListener('mousedown',function(e){mouseStart=WindowToCanvas(canvas,e.clientX,e.clientY);env=getEnv();activeShape=null;//新建圖形if(drawing){activeShape = factory(env.type,mouseStart);activeShape.lineWidth = env.lineWidth;activeShape.strokeStyle = env.strokeStyle;activeShape.fillStyle = env.fillStyle;activeShape.isFill = env.isFill;activeShape.sides = env.sides;activeShape.stars = env.stars;shapes.push(activeShape);index=-1;drawGraph();} else {//選中控制點(diǎn)后拖拽修改圖形for(var i=0,len=shapes.length;i<len;i ){if((index=shapes[i].isInPath(ctx,mouseStart))>-1){canvas.style.cursor='crosshair';activeShape=shapes[i];break;}}}// saveImageData();canvas.addEventListener('mousemove',mouseMove,false);canvas.addEventListener('mouseup',mouseUp,false);},false);// 鼠標(biāo)移動function mouseMove(e){mouseEnd=WindowToCanvas(canvas,e.clientX,e.clientY);if(activeShape){if(index>-1){activeShape.update(index,mouseEnd);} else {activeShape.initUpdate(mouseStart,mouseEnd);}drawBG();if(env.guid){drawGuidewires(mouseEnd.x,mouseEnd.y); }drawGraph();}}// 鼠標(biāo)結(jié)束function mouseUp(e){canvas.style.cursor='pointer';if(activeShape){drawBG();drawGraph();resetDrawType();}canvas.removeEventListener('mousemove',mouseMove,false);canvas.removeEventListener('mouseup',mouseUp,false);}// 刪除圖形document.body.onkeydown=function(e){if(e.keyCode==8){for(var i=0,len=shapes.length;i<len;i ){if(shapes[i].isInPath(ctx,currPos)>-1){shapes.splice(i--,1);drawBG();drawGraph();break;}}}};//繪制背景function drawBG(){ctx.clearRect(0,0,W,H);if(getEnv().grid){DrawGrid(ctx,'lightGray',10,10); }}//網(wǎng)格function drawGuidewires(x,y){ctx.save();ctx.strokeStyle='rgba(0,0,230,0.4)';ctx.lineWidth=0.5;ctx.beginPath();ctx.moveTo(x 0.5,0);ctx.lineTo(x 0.5,ctx.canvas.height);ctx.stroke();ctx.beginPath();ctx.moveTo(0,y 0.5);ctx.lineTo(ctx.canvas.width,y 0.5);ctx.stroke();ctx.restore();}//繪制圖形列表function drawGraph(){var showControl=getEnv().control;shapes.forEach(shape=>{shape.draw(ctx);if(showControl){shape.drawController(ctx);}});}

    最后

    ??功能全部完成,當(dāng)然里面有很多的細(xì)節(jié),可以查看源代碼,這里有待進(jìn)一步完善的是修改功能,比如調(diào)整邊框?qū)挾?#xff0c;改變邊框顏色和填充顏色。 還有就是本人是在mac平臺的chrome下玩canvas,因此不保證其他對es6,canvas的支持度差的瀏覽器會出現(xiàn)的問題。


    更多專業(yè)前端知識,請上 【猿2048】www.mk2048.com

    總結(jié)

    以上是生活随笔為你收集整理的canvas图形编辑器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    国产精品porn | 国产精品99久久久久 | 国内精品一区二区 | 久草在线资源观看 | 久久成人综合视频 | 国产亚洲欧美日韩高清 | 日韩精品中字 | 国产午夜三级一区二区三桃花影视 | 欧美a影视 | 玖玖在线观看视频 | 亚洲三级影院 | 日韩中文字幕免费在线观看 | 91在线国内视频 | 久久免费视频播放 | 免费网站色 | 亚洲欧美视频在线观看 | 国精产品永久999 | 日韩在线免费看 | 国产伦理一区二区 | 国产精品免费麻豆入口 | 日韩精品三区四区 | 精品中文字幕在线播放 | 午夜美女av | 国产在线观看,日本 | 国产精品123 | 国产老太婆免费交性大片 | 亚洲成人av电影在线 | 久草视频中文在线 | 国产精品亚洲综合久久 | 久久久视频在线 | 欧美在线一级片 | 日韩在线观看网址 | 国产成人一区二区三区久久精品 | 国产亚洲精品美女 | 精品999久久久| 成人毛片一区二区三区 | 四虎影视成人 | 91女神的呻吟细腰翘臀美女 | 东方av免费在线观看 | 日韩精品在线免费播放 | 国产激情免费 | 五月天综合色激情 | 97色综合 | 婷婷丁香六月天 | 久久老司机精品视频 | 亚洲精品福利在线 | 免费久久久 | 97福利在线| 又长又大又黑又粗欧美 | 99国产成+人+综合+亚洲 欧美 | 精品网站999www| 日韩高清毛片 | 尤物九九久久国产精品的分类 | 成人黄大片视频在线观看 | 99久久婷婷国产综合精品 | 黄色a在线| 精品一二三四在线 | 最近更新的中文字幕 | 国产精品一区二区三区观看 | 国产精品久久久久久模特 | 亚洲激情 在线 | 国产女v资源在线观看 | 在线成人国产 | 国产一二区在线观看 | 久久国产精品一区二区 | 中文字幕在线免费看 | 精品国产_亚洲人成在线 | 国产精品久久久久久久久免费看 | 在线观看午夜av | 久久永久视频 | 国内丰满少妇猛烈精品播 | 99精品美女| 亚洲欧洲精品一区 | 免费av高清| 视频三区 | 国产高清日韩 | 97成人超碰| 日韩欧美黄色网址 | 日韩二区三区在线观看 | 亚洲九九九 | 丁香网五月天 | 欧美一区二区三区免费看 | 91色视频 | 国产午夜精品理论片在线 | 国产真实在线 | 在线观看成人小视频 | 国产视频18 | 欧美性脚交 | 欧美激情精品久久久久 | 日韩av一区二区在线播放 | 国产五月| 永久免费观看视频 | 日韩免费看视频 | 中文字幕av有码 | 狠狠色伊人亚洲综合网站色 | 国产精品久久久一区二区三区网站 | 97天堂| 欧美坐爱视频 | 色视频一区 | 国产精品乱码久久久 | 狠狠狠狠狠狠干 | 中文字幕一区二区三区四区 | 亚洲精品观看 | 国产成人综合图片 | 波多野结衣在线中文字幕 | av青草| 欧美男女爱爱视频 | 精品国产一区二区三区久久久蜜月 | 欧美大片aaa | 最近更新中文字幕 | 国产成人精品免费在线观看 | 最新久久免费视频 | 天天插天天操天天干 | 99精品视频网| 国产精品国产三级在线专区 | 黄色片网站免费 | 欧美久久99| 手机看片99 | 国产剧情一区在线 | 久久久久久高潮国产精品视 | 国产色 在线 | 91亚洲综合 | 精品国内自产拍在线观看视频 | 啪啪精品 | 精品亚洲一区二区三区 | 亚洲午夜精品一区二区三区电影院 | 成人超碰在线 | 久久99久国产精品黄毛片入口 | 特级片免费看 | 亚洲婷婷在线 | 美女视频黄免费 | 久久久久综合网 | 久久av福利| 国产乱码精品一区二区三区介绍 | 国产日韩欧美在线免费观看 | 午夜在线免费视频 | 999国内精品永久免费视频 | 成x99人av在线www | 国产日韩精品一区二区在线观看播放 | 精品一区二区免费 | 日韩电影在线一区 | 久久99久久99精品免费看小说 | 不卡的av在线播放 | 午夜精品一区二区三区在线视频 | 九色精品在线 | 日日日干 | 在线中文字幕一区二区 | 麻豆手机在线 | 亚洲一区精品二人人爽久久 | 久久精品一级片 | 久久综合精品一区 | 国产黄色片免费在线观看 | 中文字幕区 | 国产黄在线看 | 色综合婷婷 | 久久最新 | 亚洲国产视频网站 | 免费黄色网址大全 | 91精品婷婷国产综合久久蝌蚪 | 亚洲男男gaygay无套同网址 | 精品久久久久久久久久久久久久久久 | 国产第一福利 | 国产一线天在线观看 | 久久免费的精品国产v∧ | 中文字幕 国产视频 | 一区二区成人国产精品 | 成人一区在线观看 | h久久| 激情文学综合丁香 | 国产中文在线视频 | 91日韩在线 | 精品国产伦一区二区三区观看方式 | 激情综合狠狠 | 亚洲高清视频在线播放 | 国产成人av网站 | 久久的色 | 精品国产美女在线 | 欧美有色| 人人澡人人澡人人 | 日本不卡一区二区 | 婷婷六月中文字幕 | 国产高清在线视频 | 99精品视频在线播放免费 | 成人精品99 | 在线观看亚洲 | 免费一级特黄毛大片 | 亚洲五月花| ww视频在线观看 | 日韩成人高清在线 | 碰超在线 | 国产精品青草综合久久久久99 | 人人网av| 国产免费观看久久 | 午夜av电影院 | 国产一区高清在线观看 | 99热.com | 国产精品久久久久久久久久直播 | 天天操天天干天天摸 | 国产在线观看一区 | 五月婷婷视频在线 | 婷婷色网址| 奇米影视8888 | av中文字幕剧情 | 综合在线亚洲 | 91亚洲精品国偷拍自产在线观看 | 久久国产剧场电影 | 日日干精品 | 日本不卡一区二区三区在线观看 | 久久久久女人精品毛片九一 | 精品国产91亚洲一区二区三区www | 蜜臀av性久久久久av蜜臀三区 | 99综合电影在线视频 | 婷久久 | 久久伦理电影 | 久久人人爽爽 | 玖玖在线视频观看 | a午夜在线 | 一区免费观看 | 色九九在线 | 久久免费的视频 | 91精品蜜桃 | 色妞色视频一区二区三区四区 | 国产一区91 | 天天爱天天操天天爽 | 精品国产乱码久久久久久浪潮 | 亚洲成人二区 | 久久精品国产99国产 | 九九视频在线 | 亚洲国产日韩欧美 | 91av电影| 日本午夜在线亚洲.国产 | 色妞久久福利网 | 国产精品福利在线播放 | 91桃色免费观看 | 欧美日韩一区二区三区视频 | 最近中文字幕完整视频高清1 | 一区二区三区在线视频111 | 99亚洲精品 | 中文有码在线视频 | 国内精品久久久久久久久久久 | 欧美一区二区三区在线 | 天天搞天天干天天色 | 欧美精品国产综合久久 | 亚洲精品乱码白浆高清久久久久久 | 久久成人精品电影 | 精品久久久久久国产91 | 狠狠色丁香婷婷综合久小说久 | 国产美腿白丝袜足在线av | 五月婷婷色播 | 亚洲一区精品人人爽人人躁 | 日韩av免费一区二区 | 五月婷婷六月综合 | 成人动漫一区二区三区 | 亚洲最新视频在线播放 | 日韩视频1 | 一区 在线 影院 | 97精品国产91久久久久久 | 91麻豆精品国产自产在线游戏 | 人人插超碰 | 国产一级二级视频 | 国产亚洲精品成人av久久ww | 美女久久久 | www日日| www.com在线观看 | 亚洲精品资源在线观看 | 丁香 久久 综合 | 久久狠狠干 | 看污网站| 91精品婷婷国产综合久久蝌蚪 | 91精选在线| 夜夜躁狠狠躁日日躁视频黑人 | 日日夜夜天天久久 | 中文字幕资源网在线观看 | 国产成人精品久久二区二区 | 91亚洲网 | 2017狠狠干| 激情深爱.com | 99精品视频在线观看 | 日韩综合精品 | 久久精品视频日本 | av中文国产 | 午夜一级免费电影 | 日本公妇在线观看 | 激情欧美日韩一区二区 | 亚洲视频每日更新 | 91视频免费看网站 | 又黄又爽免费视频 | www.黄色片网站 | 国产一级做a爱片久久毛片a | 国产精品国产自产拍高清av | 日韩精品五月天 | 激情五月色播五月 | 91在线免费播放视频 | 正在播放日韩 | 精品欧美小视频在线观看 | а天堂中文最新一区二区三区 | 成年免费在线视频 | 日本高清免费中文字幕 | 99久久精品国产一区 | 精品国产aⅴ麻豆 | 伊人久久国产精品 | 国产精品成人品 | 国产精品久久婷婷六月丁香 | 五月天亚洲精品 | 久久久亚洲电影 | 婷婷综合 | 久久你懂的| 99在线免费视频 | 国产在线a免费观看 | 国产精品成人自产拍在线观看 | 国产一区二区高清视频 | 久草线| 人人澡人人草 | 日韩av午夜在线观看 | 久久久久久久久久久久电影 | 久久66热这里只有精品 | 日本中文字幕免费观看 | 97精品电影院 | 日本精品xxxx | 欧美在线视频第一页 | 国产精品av在线 | 欧美日韩高清免费 | 亚洲精品美女久久 | 在线观看你懂的网址 | 91久草视频 | 狠狠狠狠狠狠干 | 欧美日韩精品国产 | 国产区在线| 亚洲天天摸日日摸天天欢 | 99精品乱码国产在线观看 | 热99在线| 97色涩| 五月婷婷中文字幕 | 日韩免费久久 | 天天操天天艹 | 国产日韩av在线 | 激情婷婷色 | 亚洲国产成人精品久久 | 国产高清免费在线观看 | 国产三级av在线 | 四虎国产精品免费 | 一区二区三区污 | v片在线播放 | 综合亚洲视频 | 国产探花视频在线播放 | 色天天天| 99热都是精品| 欧美一级久久 | 九九久久国产 | 免费视频一区二区 | 中文字幕在线播放av | 久久精品一区二区三 | 中文字幕免费一区二区 | 2018亚洲男人天堂 | 国产91学生| 欧美成人精品在线 | 国产xxxxx在线观看 | 五月天婷婷在线观看视频 | 91黄色小网站 | 69av视频在线观看 | 久久99深爱久久99精品 | av成人在线网站 | 亚洲少妇久久 | 国产福利午夜 | 亚洲精品黄网站 | 久草在线在线视频 | 夜夜高潮夜夜爽国产伦精品 | 黄色毛片观看 | 成人久久视频 | 成人视屏免费看 | 免费看黄在线 | 免费观看福利视频 | 亚洲欧美日韩中文在线 | 在线视频观看成人 | 久久免费播放 | 久久久高清视频 | 麻豆小视频在线观看 | 色偷偷人人澡久久超碰69 | 国产精品久久久久av福利动漫 | 麻豆视频入口 | 欧美日韩精品区 | 一区二区三区日韩视频在线观看 | 91片黄在线观 | 日日草天天草 | 狠狠操导航 | 俺要去色综合狠狠 | 狠狠久久综合 | 日韩一区二区三区高清免费看看 | 国产91在线免费视频 | 日韩在线第一区 | 毛片区 | 黄色av电影一级片 | 成人精品在线 | 91精品一区在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 干综合网| 亚洲综合成人在线 | 91色网址 | 亚洲国产日韩欧美在线 | 色窝资源 | 男女拍拍免费视频 | 久久人人爽人人爽人人片av软件 | 国产成人久久精品 | 一级一片免费看 | 亚洲国产精品999 | 狠狠干美女 | 麻豆视频免费在线 | 精品国产一区二区三区男人吃奶 | 欧美综合国产 | 六月丁香六月婷婷 | av中文字幕在线电影 | 欧美激情精品久久久久久变态 | 日韩精品久久久久久久电影99爱 | 日韩免费观看高清 | 91视频中文字幕 | 一级久久久| 91亚洲视频在线观看 | 亚洲精品xxxx | 在线小视频 | 男女啪啪视屏 | 182午夜在线观看 | 国产91九色蝌蚪 | 少妇精69xxtheporn | 日本视频高清 | 色.com| 99欧美视频| 99久久综合国产精品二区 | 日本69hd | 懂色av一区二区三区蜜臀 | 日韩美av在线 | 色中文字幕在线观看 | 毛片3| 午夜精品一区二区三区在线观看 | 欧美另类交在线观看 | 五月天综合色激情 | 亚洲狠狠操 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲国产免费看 | 久久综合九色综合久99 | 久久精品一二三区 | 欧美成a人片在线观看久 | 国产精品毛片一区 | 日韩高清免费电影 | av中文字幕网 | 夜夜高潮夜夜爽国产伦精品 | 成人h电影在线观看 | 日日射av | 国产精品伦一区二区三区视频 | 久草在线视频新 | 欧美日韩中文字幕综合视频 | 99 国产精品 | 久久久这里有精品 | 久久艹国产视频 | 免费黄av| 中文字幕刺激在线 | 日韩高清免费电影 | www.av小说 | 人人爽人人 | 久久精品视频国产 | 久久精品国产v日韩v亚洲 | 国产成人精品久久二区二区 | 国产精品99爱 | 中文字幕在线观看三区 | 日韩av网站在线播放 | 在线国产欧美 | 丰满少妇高潮在线观看 | 欧美日韩性 | 久久一区国产 | 久久久这里有精品 | a黄色| 亚洲黄色软件 | 国产高清不卡av | 日日操天天操夜夜操 | 国产精品热视频 | 中文字幕欧美日韩va免费视频 | 六月丁香激情综合色啪小说 | 在线一二三区 | 天天躁日日躁狠狠 | 久草视频一区 | 日韩精品2区 | 日韩爱爱网站 | 精品一区欧美 | 国语精品视频 | 99久久激情| 日韩成人中文字幕 | 成人a在线观看高清电影 | 国产真实在线 | 欧美日韩伦理一区 | www亚洲精品 | 黄色软件在线观看 | 国产一级电影 | 精品视频区 | 国产成人精品一区一区一区 | 日韩在线三级 | 成人av免费在线观看 | 不卡中文字幕av | 黄色精品视频 | 久久99国产精品久久99 | 久久久久久免费毛片精品 | 在线看片视频 | 黄色a级片在线观看 | www麻豆视频 | 亚洲一区二区精品 | 中文字幕乱码日本亚洲一区二区 | 色婷久久 | 麻豆播放 | japanesexxxxfreehd乱熟 | 超碰在线最新地址 | 国产精品一区二区免费看 | 不卡的av中文字幕 | 激情丁香| 久草网视频 | 国产一区二区在线精品 | 亚洲精品88欧美一区二区 | 字幕网资源站中文字幕 | 日韩免费一区二区 | 色婷婷综合激情 | 免费看日韩 | 国产亚洲综合精品 | 高潮久久久| 国产成人av福利 | 五月天开心 | 欧美福利视频 | 黄色av一区二区三区 | 欧美日韩国产精品一区二区 | 免费成人av网站 | 99re久久精品国产 | 免费高清在线观看成人 | 精品一区 精品二区 | 国色天香在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费国产在线精品 | 狠狠干中文字幕 | 精品国产一区二区三区蜜臀 | 日韩影视精品 | 色综合天天做天天爱 | 在线免费观看黄色 | 东方av在 | 精品色综合 | 免费在线观看日韩视频 | 97超碰成人在线 | 免费日韩 精品中文字幕视频在线 | 日韩精品一区二区三区免费观看视频 | 久久久国产一区二区 | 人人爽人人爽人人片 | 久久96国产精品久久99漫画 | 五月激情电影 | 国产成人精品综合 | 狠狠操操操 | 视频一区视频二区在线观看 | 欧美日韩国产亚洲乱码字幕 | 中文字幕中文字幕在线一区 | 丁香视频 | 黄色国产区 | 天天插天天射 | 特级西西444www大胆高清无视频 | 亚洲国产精品激情在线观看 | 免费观看丰满少妇做爰 | 西西444www大胆高清图片 | 色视频网站在线观看一=区 a视频免费在线观看 | 91在线网址| 久久久免费看片 | 337p日本欧洲亚洲大胆裸体艺术 | 久久久国产一区 | 91精品国产91久久久久久三级 | 国产一级做a | 亚洲综合视频在线观看 | 久久精品视频国产 | 91麻豆福利 | 视频99爱 | 综合激情伊人 | 青青河边草免费直播 | 欧美日韩成人 | 久久免费视屏 | 国产午夜精品一区二区三区 | 91av大全| 国产午夜三级一区二区三桃花影视 | 激情影音 | 一区二区 不卡 | 伊人久久精品久久亚洲一区 | 日本久久精品视频 | www.亚洲精品视频 | 欧美日韩高清在线一区 | 一级电影免费在线观看 | 免费观看xxxx9999片 | 91高清免费在线观看 | 久久公开免费视频 | 日韩激情中文字幕 | 日韩高清精品一区二区 | 国产一区二区在线免费播放 | 精品国产诱惑 | 国产精品自产拍在线观看 | 91视频免费国产 | 免费在线观看一区 | 欧美日韩一区二区免费在线观看 | 色婷婷天天干 | 狠狠色丁香婷婷综合橹88 | 天天做日日爱夜夜爽 | 欧美一级片免费观看 | 亚洲一区二区麻豆 | 国际av在线 | 天天躁日日躁狠狠躁av麻豆 | 一级性av | 成人黄色片免费看 | 久久久久久激情 | 91麻豆精品国产自产在线游戏 | 久久狠狠干 | 99国内精品 | 国产资源在线免费观看 | av三区在线| 6699私人影院 | 在线观看av小说 | 成人一级影视 | 免费涩涩网站 | av一级片在线观看 | 日日天天狠狠 | 激情深爱.com | 香蕉网在线播放 | 美女视频黄免费网站 | 蜜臀久久99精品久久久无需会员 | 国产一区二区精品91 | 亚洲午夜剧场 | 国产精成人品免费观看 | 99免费看片 | 日韩高清av | 国产成人免费观看 | 2019中文字幕第一页 | 国产成人久久av免费高清密臂 | 免费看污在线观看 | 蜜臀av性久久久久av蜜臀妖精 | 天天爱天天射天天干天天 | 99免费看片 | 成人a视频在线观看 | 亚洲国产偷 | 久久婷婷久久 | 波多野结衣在线中文字幕 | 最新色站 | 91九色porny在线 | 一区二区三区在线观看中文字幕 | 最近中文字幕免费av | 天天操天天谢 | 天天插综合网 | 欧美久久久久久久久久久久久 | 亚洲激情在线 | 国产精品一区二区在线 | 久久婷婷精品视频 | 国产第一福利网 | 国产成人精品电影久久久 | 免费网站在线观看人 | 玖玖视频国产 | 国产精品电影一区 | 国产精品久久久久久久久毛片 | 日韩视频图片 | 国产精品原创在线 | 很黄很污的视频网站 | 久久久999| 丁香六月伊人 | 欧美一级电影 | 天堂av免费 | 国产成人一二三 | 天天插日日射 | 操久久网 | 久久在线免费视频 | 国产乱视频| 91视频免费 | 瑞典xxxx性hd极品 | 国产黄a三级三级 | 在线免费观看视频一区二区三区 | 久久久这里有精品 | 国产美女主播精品一区二区三区 | 国产精品久久久久久久av大片 | 久久草在线免费 | 色综合久久久久综合体 | 97国产大学生情侣白嫩酒店 | 在线中文字幕电影 | 国产999视频| 国产不卡免费视频 | 91麻豆精品国产91久久久久 | 五月婷婷激情五月 | 日韩欧美网址 | 天天综合久久 | 欧美少妇bbwhd | 欧美一区中文字幕 | 一区二区三区福利 | 亚洲欧美日韩一区二区三区在线观看 | 不卡的av| 日本91在线 | 久久免费精品视频 | 国产xxxx做受性欧美88 | 久久久久久久久久久影院 | 久久狠狠亚洲综合 | 亚洲人成人99网站 | 免费黄色av电影 | www五月天com| 国产午夜三级一二三区 | 丁香视频免费观看 | 精品久久久免费 | 天天操天天舔天天爽 | 91色网址 | 色姑娘综合网 | 亚洲人成在线电影 | 天天操夜夜操夜夜操 | 日本公乱妇视频 | 中文字幕日韩电影 | 国产成人亚洲精品自产在线 | 四虎www com | 日本久久电影 | 91丨九色丨蝌蚪丨对白 | 婷婷在线精品视频 | 午夜久久久久久久久久影院 | 九九色视频 | 久草精品视频在线播放 | 国产在线高清精品 | 国产综合精品久久 | 色综合久久88色综合天天人守婷 | 在线影院av | 亚洲欧美一区二区三区孕妇写真 | 欧美日韩不卡一区二区 | 91人人干| 色噜噜日韩精品一区二区三区视频 | 一区在线观看 | 国产我不卡 | 中文字幕永久 | 九九热国产视频 | 国产视频一区二区在线播放 | 成人免费影院 | 麻豆国产精品永久免费视频 | 综合久久久久久 | 中文字幕在线视频一区二区 | 国产三级视频在线 | 久久99精品波多结衣一区 | 亚洲精品系列 | 婷婷久久网 | 亚洲在线黄色 | 精品成人a区在线观看 | 中文字幕日韩无 | 国产精品一区二区久久国产 | 色综合狠狠干 | 国产高清视频免费最新在线 | 精品久久在线 | 天天爱天天插 | 久操久 | 国产成人精品亚洲精品 | 欧美一区二区三区在线视频观看 | 国产视频一区在线 | www.色五月.com| 狠狠操夜夜 | 色多多污污在线观看 | 四虎在线观看 | 免费福利视频网站 | 欧美了一区在线观看 | 亚洲成人精品久久 | 激情婷婷久久 | 99中文视频在线 | avav99| 国产精品久久久久久爽爽爽 | 日日操夜夜操狠狠操 | 黄色网大全 | 日本爱爱免费 | 毛片一级免费一级 | 日韩美女免费线视频 | 欧美男女爱爱视频 | 日韩精品视频在线观看网址 | 久久久久久久久久久电影 | 人人澡超碰碰 | 尤物九九久久国产精品的分类 | 久久高清视频免费 | 91精品免费| 久久在线免费视频 | 91av视频导航| 99精品国产一区二区三区麻豆 | 日韩欧美成人网 | 欧洲精品久久久久毛片完整版 | 麻豆国产网站入口 | 香蕉成人在线视频 | 日韩视频在线观看视频 | 天堂av官网| 日本黄色片一区二区 | 亚州精品视频 | 伊人婷婷在线 | 天天摸天天干天天操天天射 | 很黄很污的视频网站 | 国产精品黑丝在线观看 | 黄网在线免费观看 | 99免费视频| 日韩偷拍精品 | 久久综合给合久久狠狠色 | 亚洲爱爱视频 | 国产成人精品一二三区 | www国产一区| 日韩精品久久久久 | 国产尤物一区二区三区 | 天堂av在线免费观看 | 成人全视频免费观看在线看 | 一区二区视频免费在线观看 | 视频一区二区免费 | 色伊人网| 久久综合亚洲鲁鲁五月久久 | 日本在线观看一区二区三区 | 在线观看韩日电影免费 | 午夜免费久久看 | 国产91在线观 | av免费在线网 | 亚洲精品小视频 | 色诱亚洲精品久久久久久 | 人人爽人人爽人人片av免 | 91av福利视频 | 人人干人人搞 | 亚洲影院国产 | 中文字幕av一区二区三区四区 | 激情欧美一区二区免费视频 | 日批视频在线 | 亚洲成人黄色 | 九九久久婷婷 | 天天干天天爽 | 91网免费看| 99热精品在线 | 美女网站视频色 | 在线网站黄 | 免费视频 三区 | 久久视精品 | 国产黄免费在线观看 | 国产小视频免费在线网址 | 天天躁日日躁狠狠躁av麻豆 | 五月婷久 | 色狠狠干 | 999久久a精品合区久久久 | 免费日韩电影 | 久久午夜精品视频 | 中文字幕在线免费播放 | 在线看片一区 | 91手机视频在线 | 99久久精品国产亚洲 | 久草网在线视频 | 精品在线观看国产 | 99久久婷婷国产一区二区三区 | 麻豆久久精品 | 狠狠操操 | 日韩欧美一区二区三区免费观看 | 日韩,中文字幕 | 精品亚洲国产视频 | 国产日韩欧美在线观看视频 | 精品在线亚洲视频 | 欧美肥妇free | 91网页版在线观看 | 久久久久国产免费免费 | 婷婷成人综合 | 国内视频一区二区 | 2019天天干天天色 | 精品九九九 | 久久综合五月婷婷 | 天天综合导航 | 国产欧美日韩精品一区二区免费 | 韩国av在线| a天堂中文在线 | 日本三级久久久 | 日韩成人欧美 | 蜜臀av网址 | 国产精品久久久久久久午夜片 | 91麻豆精品国产91久久久更新时间 | 亚洲黄色免费网站 | 在线精品国产 | 久久在线免费 | 91亚洲精品久久久中文字幕 | 美女亚洲精品 | 五月婷婷一区二区三区 | 国产午夜精品一区二区三区嫩草 | 91久久人澡人人添人人爽欧美 | 天堂久久电影网 | 中文字幕国内精品 | av网站免费线看精品 | 国产美女在线精品免费观看 | 亚洲乱亚洲乱亚洲 | 国产在线播放一区二区 | 久久艹久久 | 色夜影院 | 99热国产在线中文 | 一级淫片在线观看 | 国产精品入口传媒 | 国产精品资源在线观看 | 99久久日韩精品视频免费在线观看 | 7777精品伊人久久久大香线蕉 | 波多野结衣精品视频 | 2020天天干天天操 | 三级av在线播放 | 国产精品av免费观看 | 插久久 | 成人97人人超碰人人99 | 午夜123| 国产精品免费观看网站 | 五月天com| 91久久精| 久草在线观看资源 | 日韩a在线播放 | 99久久精品国产系列 | 99在线视频免费观看 | a特级毛片 | 97超碰人人网 | 亚洲码国产日韩欧美高潮在线播放 | 久久综合九色欧美综合狠狠 | 中文字幕在线人 | 国产精品免费视频网站 | 91精品国产自产91精品 | 午夜在线观看影院 | 欧美精品xxx| 亚洲一二区视频 | 日日夜夜网 | 欧美三级高清 | 精久久久久| 丁香六月五月婷婷 | 午夜三级福利 | 日日操夜| av免费黄色 | 综合激情网... | 韩国精品一区二区三区六区色诱 | 久久久免费在线观看 | 激情网色| 午夜电影 电影 | 中文字幕刺激在线 | 天天操天天操天天操天天操天天操天天操 | 久久综合九色欧美综合狠狠 | 好看的国产精品视频 | 91久久影院 | 三级在线视频播放 | 欧美乱大交 | 人人澡人摸人人添学生av | 亚洲精品在线观看免费 | 在线观看视频色 | 成人免费观看完整版电影 | 久久电影日韩 | 国产精品久久久久久久免费 | 91精品国产综合久久福利 | 欧美高清视频不卡网 | 亚洲美女免费精品视频在线观看 | 免费看的av片 | 久久人人97超碰精品888 | 国产乱对白刺激视频不卡 | 久久久久久久久久影院 | 久草久热 | 97在线视| 国产日韩精品一区二区在线观看播放 | 3d黄动漫免费看 | 欧美一级特黄aaaaaa大片在线观看 | 久久九九影院 | 人人草在线视频 | 五月婷婷综合色拍 | 欧美日韩一级在线 | 最近字幕在线观看第一季 | 亚洲国产午夜精品 | 伊人激情网 | 亚洲色图22p| 91视频首页 | 97超碰人人网 | 久久久国产一区 | 91精品国产综合久久福利不卡 | 黄色大全免费观看 | 久久亚洲精品国产亚洲老地址 | 久久午夜羞羞影院 | 亚洲国产日韩一区 | 色综合天天做天天爱 | 国产一区二区久久精品 | avav99| 玖玖国产精品视频 | 国产精品18久久久久久首页狼 | av在线免费网 | 久久久久久久久久久高潮一区二区 | 国产一级a毛片视频爆浆 | 国产精品久久久久久一二三四五 | av直接看| 国产精品对白一区二区三区 | 91片黄在线观看动漫 | 亚洲视频,欧洲视频 | 国产 精品 资源 | 免费观看性生交大片3 | 在线视频精品 | av成人免费在线观看 | 超碰人人干人人 | 九九视频一区 | 精品国产一区二区三区久久影院 | www欧美xxxx| 日韩三级久久 | 五月婷婷综合激情网 | av电影免费在线看 | 免费看片成年人 | 日韩高清在线一区二区 | 亚洲精品中文在线观看 | 热久久这里只有精品 | 欧美与欧洲交xxxx免费观看 | 色噜噜噜噜 | 干 操 插 | 精品视频9999 | 看毛片的网址 | 99精品视频免费全部在线 | .国产精品成人自产拍在线观看6 | 久久人人97超碰com | 成年人免费在线播放 | 成片人卡1卡2卡3手机免费看 | 激情狠狠干 |