<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        RequireJS簡易繪圖程序開發

        來源:懂視網 責編:小采 時間:2020-11-27 20:28:43
        文檔

        RequireJS簡易繪圖程序開發

        RequireJS簡易繪圖程序開發:前言RequireJS的出現讓前端代碼模塊化變得容易,當前端項目越來越大,代碼越來越多的時候,模塊化代碼讓項目結構更清晰,不僅在開發時讓我們的思路更清晰,而且后期維護起來也更容易。下面是我學習RequireJS后使用RequireJS開發的一款簡易繪圖程序,運行在瀏
        推薦度:
        導讀RequireJS簡易繪圖程序開發:前言RequireJS的出現讓前端代碼模塊化變得容易,當前端項目越來越大,代碼越來越多的時候,模塊化代碼讓項目結構更清晰,不僅在開發時讓我們的思路更清晰,而且后期維護起來也更容易。下面是我學習RequireJS后使用RequireJS開發的一款簡易繪圖程序,運行在瀏
        前言

        RequireJS的出現讓前端代碼模塊化變得容易,當前端項目越來越大,代碼越來越多的時候,模塊化代碼讓項目結構更清晰,不僅在開發時讓我們的思路更清晰,而且后期維護起來也更容易。下面是我學習RequireJS后使用RequireJS開發的一款簡易繪圖程序,運行在瀏覽器中如下圖所示:

        20161028154506320.gif

        開始

        這個簡易繪圖程序的項目結構如下圖所示:

        其中index.html是項目的主頁,js目錄下存放所有js文件,js/app目錄為我們自定義的模塊文件,js/lib目錄中暫時沒有文件,當我們的項目里用到一些其他前端框架如jquery等時,js/lib目錄就存放這些框架的js文件,js/main.js為requirejs的配置文件,主要是配置一些路徑,js/require.min.js是RequireJS框架的文件。下面請跟我一步一步完成這個簡易的繪圖程序吧!

        一、配置requirejs

        本項目的配置文件代碼放在js/main.js中,代碼內容如下:

        require.config({
         baseUrl: 'js/lib',
         paths: {
         app: '../app'
         }
        })

        主要就是配置了項目根目錄為'js/lib',然后配置了一個名為'app'的路徑,路徑為'../app',即'js/app'目錄。

        二、編寫模塊代碼

        這個項目中的模塊主要有如下幾個:point.js, line.js, rect.js, arc.js, utils.js,下面一一說明:

        point.js:

        point.js這個模塊代表一個點(x, y),代碼如下:

        /** 點 */
        define(function() {
         return function(x, y) {
         this.x = x;
         this.y = y;
         this.equals = function(point) {
         return this.x === point.x && this.y === point.y;
         };
         };
        })

        上面的代碼中使用define定義了點這個模塊,在回調函數中返回了一個類,該類有兩個參數x,y,還有一個equals方法用于比較兩個點是否相等。
        要使用這個模塊,我們可以使用如下代碼:

        require(['app/point'], function(Point) {
         //新建一個點類的對象
         var point = new Point(3, 5);
        })

        這里需要注意require()函數的第一個參數是一個數組,回調函數中的Point就代表了我們的點類,通過new Point()的方式創建點類的對象。

        line.js:

        line.js模塊代表的是一條直線,代碼如下:

        /** 直線 */
        define(function() {
         return function(startPoint, endPoint) {
         this.startPoint = startPoint;
         this.endPoint = endPoint;
         this.drawMe = function(context) {
         context.strokeStyle = "#000000";
         context.beginPath();
         context.moveTo(this.startPoint.x, this.startPoint.y);
         context.lineTo(this.endPoint.x, this.endPoint.y);
         context.closePath();
         context.stroke();
         }
         }
        })

        直線模塊的定義跟點模塊的定義類似,都是在define的回調函數中返回一個類,這個直線類的構造方法中有兩個點類的參數,代表直線的起點和終點,直線類還有一個drawMe方法,通過傳入一個context對象,將自身畫出來。

        rect.js:

        rect.js模塊代表一個矩形,代碼如下:

        /** 矩形 */
        define(['app/point'], function() {
         return function(startPoint, width, height) {
         this.startPoint = startPoint;
         this.width = width;
         this.height = height;
         this.drawMe = function(context) {
         context.strokeStyle = "#000000";
         context.strokeRect(this.startPoint.x, this.startPoint.y, this.width, this.height);
         }
         }
        })

        其中startPoint是矩形左上角的點的坐標,是一個point類,width和height分別代表矩形的寬高,同時還有一個drawMe方法將矩形自身畫出來。

        arc.js:

        arc.js模塊代表一個圓形,代碼如下:

        /** 圓形 */
        define(function() {
         return function(startPoint, radius) {
         this.startPoint = startPoint;
         this.radius = radius;
         this.drawMe = function(context) {
         context.beginPath();
         context.arc(this.startPoint.x, this.startPoint.y, this.radius, 0, 2 * Math.PI);
         context.closePath();
         context.stroke();
         }
         }
        })

        其中startPoint代表圓形所在的矩形的左上角的點的坐標,radius代表圓的半徑,drawMe方法是畫圓的方法。
        在以上幾個模塊中,直線類、矩形類、圓形類都包含有drawMe()方法,這里涉及到了canvas繪圖的知識,如果有不太清楚的,可以查一下文檔:HTML 5 Canvas 參考手冊

        utils.js

        utils.js模塊主要是用來處理各種圖形繪制的工具類,包括直線、矩形、圓形的繪制,也包括記錄繪制軌跡、清除繪制軌跡,代碼如下:

        /** 管理繪圖的工具 */
        define(function() {
         var history = []; //用來保存歷史繪制記錄的數組,里面存儲的是直線類、矩形類或者圓形類的對象
         
         function drawLine(context, line) {
         line.drawMe(context);
         }
         
         function drawRect(context, rect) {
         rect.drawMe(context);
         }
         
         function drawArc(context, arc) {
         arc.drawMe(context);
         }
         
         /** 添加一條繪制軌跡 */
         function addHistory(item) {
         history.push(item);
         }
         
         /** 畫出歷史軌跡 */
         function drawHistory(context) {
         for(var i = 0; i < history.length; i++) {
         var obj = history[i];
         obj.drawMe(context); 
         }
         }
         
         /** 清除歷史軌跡 */
         function clearHistory() {
         history = [];
         }
         
         return {
         drawLine: drawLine,
         drawRect: drawRect,
         drawArc: drawArc,
         addHistory: addHistory,
         drawHistory: drawHistory,
         clearHistory: clearHistory
         };
        })

        三、編寫界面代碼,處理鼠標事件

        上面已經將本次簡易繪圖程序的模塊都定義完了,在繪制圖形時用到的也就是上面幾個模塊,下面要開始編寫主界面的代碼了,主界面里包含四個按鈕,還有一塊大的畫布用于繪圖,下面直接上index.html文件的代碼:

        <!DOCTYPE html>
        <html lang="en">
        <head>
         <meta charset="UTF-8">
         <title>簡易繪圖程序</title>
         <style type="text/css">
         canvas {
         background-color: #ECECEC;
         cursor: default; /** 鼠標設置成默認的指針 */
         }
         .tool-bar {
         margin-bottom: 10px;
         }
         </style>
        </head>
        <body>
         <div class="tool-bar">
         <button id="btn-line">畫直線</button>
         <button id="btn-rect">畫矩形</button>
         <button id="btn-oval">畫圓形</button>
         <button id="btn-clear">清空畫布</button>
         <span id="hint" style="color: red;">當前操作:畫直線</span>
         </div>
         <canvas id="canvas" width="800" height="600"></canvas>
         <script type="text/javascript" src="js/require.min.js" data-main="js/main"></script>
         <script type="text/javascript">
         require(['app/point', 'app/line', 'app/rect', 'app/arc', 'app/utils'],
         function(Point, Line, Rect, Arc, Utils) {
         
         var canvas = document.getElementById("canvas");
         var context = canvas.getContext('2d');
         var canvasRect = canvas.getBoundingClientRect(); //得到canvas所在的矩形
         canvas.addEventListener('mousedown', handleMouseDown);
         canvas.addEventListener('mousemove', handleMouseMove);
         canvas.addEventListener('mouseup', handleMouseUp);
         bindClick('btn-clear', menuBtnClicked);
         bindClick('btn-line', menuBtnClicked);
         bindClick('btn-rect', menuBtnClicked);
         bindClick('btn-oval', menuBtnClicked);
         
         var mouseDown = false;
         var selection = 1; // 0, 1, 2分別代表畫直線、畫矩形、畫圓
         
         var downPoint = new Point(0, 0),
         movePoint = new Point(0, 0),
         upPoint = new Point(0, 0);
         var line;
         var rect;
         var arc;
         
         /** 處理鼠標按下的事件 */
         function handleMouseDown(event) {
         downPoint.x = event.clientX - canvasRect.left;
         downPoint.y = event.clientY - canvasRect.top;
         if(selection === 0) {
         line = new Line(downPoint, downPoint);
         line.startPoint = downPoint;
         } else if(selection === 1) {
         rect = new Rect(new Point(downPoint.x, downPoint.y), 0, 0);
         } else if(selection === 2) {
         arc = new Arc(new Point(downPoint.x, downPoint.y), 0);
         }
         mouseDown = true;
         }
         
         /** 處理鼠標移動的事件 */
         function handleMouseMove(event) {
         movePoint.x = event.clientX - canvasRect.left;
         movePoint.y = event.clientY - canvasRect.top;
         if(movePoint.x == downPoint.x && movePoint.y == downPoint.y) {
         return ;
         }
         if(movePoint.x == upPoint.x && movePoint.y == upPoint.y) {
         return ;
         }
         if(mouseDown) {
         clearCanvas();
         if(selection == 0) {
         line.endPoint = movePoint;
         Utils.drawLine(context, line);
         } else if(selection == 1) {
         rect.width = movePoint.x - downPoint.x;
         rect.height = movePoint.y - downPoint.y;
         Utils.drawRect(context, rect);
         } else if(selection == 2) {
         var x = movePoint.x - downPoint.x;
         var y = movePoint.y - downPoint.y;
         arc.radius = x > y ? (y / 2) : (x / 2);
         if(arc.radius < 0) {
         arc.radius = -arc.radius;
         }
         arc.startPoint.x = downPoint.x + arc.radius;
         arc.startPoint.y = downPoint.y + arc.radius;
         Utils.drawArc(context, arc);
         }
         Utils.drawHistory(context);
         }
         }
         
         /** 處理鼠標抬起的事件 */
         function handleMouseUp(event) {
         upPoint.x = event.clientX - canvasRect.left;
         upPoint.y = event.clientY - canvasRect.top;
         
         if(mouseDown) {
         mouseDown = false;
         if(selection == 0) {
         line.endPoint = upPoint; 
         if(!downPoint.equals(upPoint)) {
         Utils.addHistory(new Line(new Point(downPoint.x, downPoint.y),
         new Point(upPoint.x, upPoint.y)));
         } 
         } else if(selection == 1) {
         rect.width = upPoint.x - downPoint.x;
         rect.height = upPoint.y - downPoint.y;
         Utils.addHistory(new Rect(new Point(downPoint.x, downPoint.y), rect.width, rect.height));
         } else if(selection == 2) {
         Utils.addHistory(new Arc(new Point(arc.startPoint.x, arc.startPoint.y), arc.radius));
         }
         clearCanvas();
         Utils.drawHistory(context);
         }
         }
         
         /** 清空畫布 */
         function clearCanvas() {
         context.clearRect(0, 0, canvas.width, canvas.height);
         }
         
         /** 菜單按鈕的點擊事件處理 */
         function menuBtnClicked(event) {
         var domID = event.srcElement.id;
         if(domID === 'btn-clear') {
         clearCanvas();
         Utils.clearHistory();
         } else if(domID == 'btn-line') {
         selection = 0;
         showHint('當前操作:畫直線');
         } else if(domID == 'btn-rect') {
         selection = 1;
         showHint('當前操作:畫矩形');
         } else if(domID == 'btn-oval') {
         selection = 2;
         showHint('當前操作:畫圓形');
         }
         }
         
         function showHint(msg) {
         document.getElementById('hint').innerHTML = msg;
         }
         
         /** 給對應id的dom元素綁定點擊事件 */
         function bindClick(domID, handler) {
         document.getElementById(domID).addEventListener('click', handler);
         }
         });
         </script>
        </body>
        </html>

        index.html文件中的代碼比較多,但最主要的代碼還是對鼠標按下、移動、抬起三種事件的監聽和處理,另外,獲取鼠標在canvas中的坐標位置需要注意一點:由于event對象中獲取的clientX和clientY是鼠標相對于頁面的坐標,為了獲取鼠標在canvas中的坐標,需要獲得canvas所在的矩形區域,然后用clientX-canvas.left,clientY-canvas.top,來獲取鼠標在canvas中的位置。

        已知bug

        在畫圓形時需要鼠標從左上角拖到右下角畫圓,如果不是這樣,圓的位置會有問題。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        RequireJS簡易繪圖程序開發

        RequireJS簡易繪圖程序開發:前言RequireJS的出現讓前端代碼模塊化變得容易,當前端項目越來越大,代碼越來越多的時候,模塊化代碼讓項目結構更清晰,不僅在開發時讓我們的思路更清晰,而且后期維護起來也更容易。下面是我學習RequireJS后使用RequireJS開發的一款簡易繪圖程序,運行在瀏
        推薦度:
        標簽: 軟件 開發 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 免费无码一区二区三区蜜桃| 日韩精品免费电影| 日本一道本高清免费| 亚洲成熟xxxxx电影| 免费一级毛片在级播放| 永久久久免费浮力影院| 亚洲一级毛片免观看| 在线观看免费无码专区| 亚洲精品无码午夜福利中文字幕 | 最近高清中文字幕免费| 亚洲人午夜射精精品日韩| 美国免费高清一级毛片| 国产免费观看黄AV片| 亚洲av女电影网| 亚洲自偷自偷在线成人网站传媒| 男女啪啪免费体验区| 免费欧洲毛片A级视频无风险| 亚洲人成电影福利在线播放| 精品国产麻豆免费人成网站| 国产精品久久久亚洲| 日韩精品无码一区二区三区免费 | 亚洲综合激情五月色一区| 84pao国产成视频免费播放| 国产精品国产午夜免费福利看| 亚洲精品乱码久久久久久中文字幕 | 在线观看H网址免费入口| 亚洲精品亚洲人成在线观看麻豆| 又粗又长又爽又长黄免费视频| 在线免费观看国产| 成人免费看吃奶视频网站| 亚洲色丰满少妇高潮18p| 国产精品视_精品国产免费| 精品免费AV一区二区三区| 亚洲国产精品尤物yw在线| 国产精品福利在线观看免费不卡| 国拍在线精品视频免费观看| 中国亚洲呦女专区| 又色又污又黄无遮挡的免费视| 亚洲AV成人无码天堂| 久久国产精品免费专区| 国产亚洲日韩一区二区三区|