相容小程式的canvas畫圖組件jmGraph

来源:https://www.cnblogs.com/jiamao/archive/2018/11/22/10003705.html
-Advertisement-
Play Games

基於CANVAS的簡單畫圖組件讓你用類似於dom的方式,在canvas上畫圖,感覺會不會很爽。 主頁:http://graph.jm47.com/示例:http://graph.jm47.com/example/index.html 安裝 直接從github下載 https://github.com ...


基於CANVAS的簡單畫圖組件
讓你用類似於dom的方式,在canvas上畫圖,感覺會不會很爽。

主頁:http://graph.jm47.com/
示例:http://graph.jm47.com/example/index.html

安裝

直接從github下載

https://github.com/jiamao/jmgraph


入門

下載jmGraph.min.js代碼,並引用到你的html中。

<script type="text/javascript" src="../dist/jmGraph.min.js"></script>	

  

在dom中添加一個div或canvas,然後初始化jmGraph。

<div id="mycanvas_container"></div>
<script type="text/javascript">    
    //也可以是一個dom對象或一個jquery對象 
    //例如:$('#mycanvas_container') || document.getElementById('mycanvas_container')
    var container = 'mycanvas_container';

    // 用Promise方式
    /*jmGraph(container, {
        width: 800,
        height: 600
    }).then((g)=>{
        //g就是一個jmGraph實例
        init(g);
    });    */
    
    var g = new jmGraph(container, {
        width: 800,
        height: 600,
        //樣式,規則請參照樣式說明
        style: {
            fill: '#000' //指定背景色
        }
    });
</script>

 

在畫布上畫一個方塊

function init(g){
    var style = {
        stroke:'#46BF86',
        lineWidth: 2
    };
    style.shadow = '0,0,10,#fff';//陰影
    //style.opacity = 0.2;            
    //style.lineCap = 'round';

    //創建一個方塊
    var rect = g.createShape('rect',{
        style:style,
        position: {x:100,y:100}, //左上角坐標
        width:100,
        height:100
    });
    g.children.add(rect);

    //繪製,可以用requestAnimationFrame動態刷新
    function update() {
        g.redraw();
        //requestAnimationFrame(update);
    }
    update();
}

 

樣式

樣式可以直接用canvas支持的名稱,也可以用本組件簡化後的。

樣式一覽

簡化名稱原生名稱說明
fill fillStyle 用於填充繪畫的顏色、漸變或模式
stroke strokeStyle 用於筆觸的顏色、漸變或模式
shadow 沒有對應的 最終會解析成以下幾個屬性,格式:'0,0,10,#fff'或g.createShadow(0,0,20,'#000');
shadow.blur shadowBlur 用於陰影的模糊級別
shadow.x shadowOffsetX 陰影距形狀的水平距離
shadow.y shadowOffsetY 陰影距形狀的垂直距離
shadow.color shadowColor 陰影顏色,格式:'#000'、'#46BF86'、'rgb(255,255,255)'或'rgba(39,72,188,0.5)'
lineWidth lineWidth 當前的線條寬度
miterLimit miterLimit 最大斜接長度
font font 文本內容的當前字體屬性
opacity globalAlpha 繪圖的當前 alpha 或透明值
textAlign textAlign 文本內容的當前對齊方式
textBaseline textBaseline 在繪製文本時使用的當前文本基線
lineJoin lineJoin 兩條線相交時,所創建的拐角類型:miter(預設,尖角),bevel(斜角),round(圓角)
lineCap lineCap 線條的結束端點樣式:butt(預設,平),round(圓),square(方)
zIndex - 控制項層級,同級節點值越大層級越高

事件

事件的綁定函數:bind/unbind
示例:

//創建一條線
var line = graph.createLine({x:10,y:200},{x:80,y:120},style);
//滑鼠移到上面顯示不同的樣式            
line.bind('mouseover',function(evt) {
    this.style.stroke = 'rgba(39,72,188,0.5)';
    this.cursor('pointer');
    this.neadUpdate = true; //需要刷新
});

 

事件一覽

名稱說明回調參數
mousedown 滑鼠按下時觸發 -
mousemove 滑鼠在對象上移動時觸發 {target:當前元素,position: 當前位置}
mouseover 滑鼠從某元素移開 {target:當前元素}
mouseleave 某個滑鼠按鍵被鬆開 -
mouseup 某個滑鼠按鍵被鬆開 -
dblclick 滑鼠雙擊某個對象 -
click 滑鼠點擊某個對象 -
touchstart 觸控開始 position: 當前位置
touchmove 觸控移動手指 position: 當前位置
touchend 觸控結束 position: 當前位置

控制項

Path

path是多數圖形的基類,可以指定一個points數組來繪製一個路徑。
線上示例

var path = graph.createPath(null,style);
path.points.push({x:10,y:10});
path.points.push({x:10,y:60});
path.points.push({x:80,y:20});
path.points.push({x:90,y:80});
path.points.push({x:80,y:80});

 

arc可以創建橢圓、圓弧和圓,circle調用的是原生的arc函數繪製,harc可以繪製一個圓環。 具體請參考示例。 線上示例

//創建一個橢圓,指定不同的寬高就為橢圓。如果相同或指定半徑則為圓。
var arc1 = g.createShape('arc', {
    style: style,
    center: {x:100, y:150},
    width: 120,
    height: 80
});        

 

箭頭

arraw為創建一個箭頭, arrawline是一條帶箭頭的直線。
具體請參考示例。 線上示例

//帶箭頭的直線
var shape = g.createShape('arrawline',{
    style:style,
    start: {x:100,y:100},
    end: {x: 200, y: 350}
});    
//一起結束點和一個角度angle可以決定一個箭頭,如果不填angle,則會用start和end來計算角度
var arraw = g.createShape('arraw',{
    style:style,
    start: {x:150, y:120},
    end: {x: 160, y: 150}
    //angle: Math.PI/2, //箭頭角度  可以不填
    //offsetX: 5, //箭頭X偏移量
    //offsetY: 8 //箭頭Y偏移量
});    

 

貝塞爾曲線

bezier可以指定無隱個控制點,繪製複雜的曲線。 具體請參考示例。 線上示例

//一個固定的bezier曲線
var bezier = g.createShape('bezier', { style: style, points: [p0, p1, p2, p3, p4] });

 

圖片

img是用來承載一張圖片的控制項,可以用style.src來指定圖片url。 具體請參考示例。 線上示例

var style = {
    src: 'http://mat1.gtimg.com/www/qq2018/imgs/qq_logo_2018x2.png'
};
style.shadow = '0,0,10,#fff';
//style.opacity = 0.2;        

//創建一個image
var img = g.createShape('image',{
    style:style,
    position: {x:100,y:100}
});    
//設置圖片可以用滑鼠移動        
img.canMove(true);

 

文字

label可以用來繪製文字,通過style指定樣式。 具體請參考示例。 線上示例

var style = {
    stroke: '#effaaa',
    fill: '#fff',
    textAlign: 'center', //水平居中
    textBaseline: 'middle', //垂直居中
    font: '20px Arial',
    border: {left:1,top:1,right:1,bottom:1}, //邊框
    shadow: '0,0,10,#fff'
};
//style.opacity = 0.2;        

//創建一個label
var label = g.createShape('label',{
    style:style,
    position:{x:200,y:150},
    text:'test label',
    width:120,
    height:80
});        

 

棱形

prismatic
具體請參考示例。 線上示例

var prismatic = g.createShape('prismatic',{
    style:style,
    center:{x:200,y:150},
    width:120,
    height:80
});        

 

可縮放控制項

resize 可以自由放大縮小的控制項。 具體請參考示例。 線上示例

var style = {
    stroke: 'red',
    fill: 'yellow',
    lineWidth: 2, //邊線寬
    //小方塊樣式
    rectStyle: {
        stroke: 'green', //小方塊邊顏色
        fill: 'transparent',//小方塊填充色
        lineWidth: 1, //小方塊線寬
        close: true
    }
};
//style.opacity = 0.2;        

//創建一個resize
var resize = g.createShape('resize', {
    style: style,
    position: {x:200, y:150},
    width: 120,
    height: 80
});    
//大小改變事件
resize.on('resize', function() {
    console.log(arguments);
});    

 

自定義控制項

大多數控制項直接繼承jmPath即可,然後通過實現initPoints來繪製當前控制項。
當需要從某點重新開始畫時,給點指定m屬性為true,表示移到當前點。

示例

來畫一個X
線上示例:http://graph.jm47.com/example/controls/test.html

function jmTest(graph,params) {
    if(!params) params = {};
    this.points = params.points || [];
    var style = params.style || {};
    
    this.type = 'jmTest';
    this.graph = graph;
        
    this.center = params.center || {x:0,y:0};
    this.radius = params.radius || 0;

    this.initializing(graph.context, style);
}
jmUtils.extend(jmTest, jmPath);//jmPath

//定義屬性

/**
 * 中心點
 * point格式:{x:0,y:0,m:true}
 * @property center
 * @type {point}
 */
jmUtils.createProperty(jmTest.prototype, 'center');

/**
 * 半徑
 * @property radius
 * @type {number}
 */
jmUtils.createProperty(jmTest.prototype, 'radius', 0);


/**
 * 初始化圖形點
 * 控制項都是由點形成
 * 
 * @method initPoint
 * @private
 * @for jmArc
 */
jmTest.prototype.initPoints = function() {
    //可以獲取當前控制項的左上坐標,可以用來畫相對位置
    var location = this.getLocation();//獲取位置參數
    
    var cx = location.center.x ;
    var cy = location.center.y ;
    
    this.points = [];

    //簡單的畫一個X

    //根據半徑計算x,y偏移量
    //由於是圓,偏移量相同
    var offw = Math.sqrt(location.radius * location.radius / 2);
    //左上角到右下角對角線
    this.points.push({x:cx - offw, y:cy-offw}, {x:cx + offw, y:cy+offw});

    //左下角到右上角對角線
    //畫完上面的線後,需要重新移到這條線的起點,指定m:true即可
    this.points.push({x:cx - offw, y:cy+offw, m:true}, {x:cx + offw, y:cy-offw});

    return this.points;
}

 

微信小程式支持

微信小程式稍有差別,因為無需壓縮,請直接把dist中的jmgraph.js合併後的文件引用到你的小程式中。

示例

wxml

<canvas style="width: 400px; height: 600px;background:#000;" 
    canvas-id="mycanvas" 
    bindtouchstart="canvastouchstart" 
    bindtouchmove="canvastouchmove" 
    bindtouchend="canvastouchend" 
    bindtouchcancel="canvastouchcancel">
</canvas>

 

javascript

/**
   * 生命周期函數--監聽頁面初次渲染完成
   */
  onReady: function () {
    
    //這裡引用jmgraph
    let jmGraph = require('../../utils/jmgraph');

    var self = this;

    jmGraph('mycanvas', {
      width: 400,
      height: 600
    }).then((g) => {
      init(g)
    });

    function init(g) {
      //g.style.fill = '#000'; //畫布背景
      var style = {
        stroke: '#46BF86',
        fill: '#556662',
        lineWidth: 2
      };
      style.shadow = '0,0,10,#fff';
      //style.opacity = 0.2;            
      //style.lineCap = 'round';

      //創建一個方塊
      var rect = g.createShape('rect', {
        style: style,
        position: { x: 100, y: 100 },
        width: 100,
        height: 100
      });
      rect.canMove(true);
      g.children.add(rect);

      function update() {
        if (g.needUpdate) g.redraw();
        setTimeout(update, 20);
      }

      update();

      //初始化jmGraph事件
      //把小程式中的canvas事件交給jmGraph處理
      self.canvastouchstart = function() {
        return g.eventHandler.touchStart.apply(this, arguments);
      }
      self.canvastouchmove = function() {
        return g.eventHandler.touchMove.apply(this, arguments);
      }
      self.canvastouchend = function() {
        return g.eventHandler.touchEnd.apply(this, arguments);
      }
      self.canvastouchcancel = function() {
        return g.eventHandler.touchCancel.apply(this, arguments);
      }
    }
  }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡記錄兩個iOS開發中經常用到的知識點,一個是唯一標識,一個是全局變數。唯一標識一臺設備(比如iPhone、iPad等)是一個基本的實現與業務上的需求,因為這個唯一標識在許多場景都需要使用到,比如用來統計(日活、總用戶數等),再比如用作預設的賬號,等等。 ...
  • 平時在使用Vue框架的業務開發中,組件不僅僅要把模板的內容進行復用,更重要的是組件之間要進行通信。組件之間通信分為三種:父-子;子-父;跨級組件通信。下麵,就組件間如何通信做一些總結。 1.父組件到子組件通過props通信 在組件中,使用選項props來聲明需要從父級組件接受的數據,props的值可 ...
  • 在開發的過程中,遍歷是一個經常遇到的。而for迴圈則是Javascript工具箱里一個好用的,也常用的工具。每個人的習慣不同,for迴圈的寫法也不盡相同。 1、不寫聲明變數的寫法: 我們很多時候的寫法使這種(做小白不堪迴首的那些年),但這種寫法,每次都會獲取一下數組的長度,這會降低代碼的效率。 2、 ...
  • Vue源碼解析之nextTick 前言 nextTick是Vue的一個核心功能,在Vue內部實現中也經常用到nextTick。但是,很多新手不理解nextTick的原理,甚至不清楚nextTick的作用。 那麼,我們就先來看看nextTick是什麼。 nextTick功能 看看官方文檔的描述: 在下 ...
  • 摘要: 本插件基於layui.layedit,增加了HTML源碼模式,片插入功能添加alt屬性(layupload),視頻插入功能,全屏功能,段落格式,字體顏色設置,右鍵菜單操作,插入錨點,水平線功能。 所有拓展功能菜單按鈕圖標均引用自layui自帶圖標。 演示地址:kz.layedit 一、基礎拓 ...
  • RegExp語法(包含ES2018標準) 註意:本次所有代碼都僅在Chrome 70中進行測試 1. 正則表達式是什麼? 正則表達式是用於匹配字元串中字元組合的模式。(mdn) 簡單來說,正則表達式是用來提取、捕獲文本(匹配字元)的。 2. 創建: 字面量: 構造函數: 3. 實例屬性: 每個正則表 ...
  • 安裝 cordova 新建項目 運行項目 編譯項目 修改編譯輸出 打開vue項目目錄下麵的index.html,添加 打開/config/index.js 編譯打包 先刪除 cordova項目下的www文件夾里的東西 執行編譯vue項目將輸出到 cordova 項目目錄下的www文件內 添加andr ...
  • 寫JS時,不斷翻看HTML,確保`querySelector`能取到期望的元素。 改HTML時,一個個排查JS文件,確保其沒受影響。 類似的情況很影響我們工作效率。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...