QML畫圖-Canvas

定義畫筆
Canvas
    {
        id: canvas;
        width: 100; height: 100 //畫布需要定義面積    
        onPaint:    //繪圖方法
        {
        //運用JS繪圖
        }
    }
canvas默認是透明的,沒有背景色
Canvas畫圖是通過javascript來做的

1.畫筆
  a.得到畫筆
  var ctx = canvas.getContext("2d"); //目前只有2d畫筆
  畫筆是唯一的,需要畫不同的顏色需要重新賦值顏色
  b.移動畫筆

  ctx.moveTo(x, y);

  c.開啓新路徑

   ctx.beginPath()

   開始一條路徑,或重置當前的路徑。

   如果前面有定義路徑且沒有執行ctx.stroke(),前面的路徑不會繪製。

   如果有改變strokeStyle,沒有ctx.beginPath()會導致樣式混亂。因爲canvas在第二次給路徑上色時,是把之前的所有路徑軌跡合在一起來上色的


2.畫筆屬性設置
  a.設置畫筆寬度
    ctx.lineWidth=10;
  b.畫筆轉折樣式
    lineJoin = 'miter' //尖角default
             //'bevel' 斜角
             //'round' 圓角
  c.lineCap = 'butt' //平default
             //'round' //圓,冒出一截,線的寬度

             //'square' //方,冒出一截,線的寬度

  d.畫筆描邊樣式/顏色
    ctx.strokeStyle='rgba(255, 0, 0, 0.5)'  //rgb顏色,透明度0~1

3.畫直線
  ctx.moveTo(0, 0) //起點
  ctx.lineTo(100, 100)  //線(到終點)
  ctx.stroke() //描邊,把線畫出來
  a.可以連續定義多條線再描邊
  b.畫筆有寬度,可能出現缺的情況
    ctx.moveTo(100,100);
    ctx.lineTo(200,100);
    ctx.moveTo(200,100); //注意這裏,畫筆有個中線,有缺口
    ctx.lineTo(200,200);
    ctx.lineTo(100,200); //沒有提起畫筆,所以沒有缺口
    ctx.lineTo(100,100);
    ctx.lineWidth = 10;
    ctx.strokeStyle = 'rgba(255,0,0,0.5)';
    ctx.stroke();
    可以用ctx.closePath(); //閉合路徑,填掉缺口,如果畫的線沒有閉合,自動補充一條直線從終點到上一個moveTo的點
   c.寬度爲1像素的線
     模糊不清,不像一個像素:canvas劃線是從中線向兩側延伸,劃線是佔相鄰兩個像素的一半,但計算機不允許小於1px的圖形,所以佔了兩個像素
     解決:以.5來定位
     ctx.moveTo(100.5,100.5);
     ctx.lineTo(200.5,100.5);
  注:canvas的繪圖過程(即填充與描邊)是非常消耗資源的,如果想節省系統資源提高效率,最好是繪製好所有路徑,再一次性填充或描邊圖形

4.繪圖的兩種方式
  a.描邊:
    ctx.stroke()
    1)描邊樣式/顏色
      ctx.strokeStyle='rgba(255, 0, 0, 0.5)'  //rgb顏色,透明度0~1
  b.填充:
    ctx.fill()
    1)填充顏色/樣式
       ctx.fillStyle='顏色' //默認的填充樣式是不透明的黑色
    2)未閉合的路徑的填充
      Canvas會從你當前路徑的終點直接連接到起點,然後填充。
    3)填充漸變顏色,漸變顏色分爲兩種:線性漸變和徑向漸變
      1>線性漸變
      var linear = ctx.createLinearGradient(x1,x2,x3,x4); //起點和終點,定義漸變線
      linear.addColorStop(0, '#fff');  //給漸變線添加顏色
      linear.addColorStop(0.5, '#f0f'); //addColorStop(0-1<可以是兩位小數表示百分比>)
      linear.addColorStop(1, '#333');
      ctx.fillStyle = linear; //把漸變色賦值爲填充樣式
      ctx.fillRect(100,100,100,100);
      ctx.stroke(); //fillRect與strokeRect畫出的都是獨立路徑,不會把剛畫出的矩形描邊
      2>徑向漸變(圓形漸變)
      createRadialGradient(x1,y1,r1,x2,y2,r2) //起點終點都是圓//起點圓可以看成比較大的原點
      var radial = ctx.createRadialGradient(55,55,10,55,55,55); //重合的圓心座標
      radial.addColorStop(0,'#fff');
      radial.addColorStop(0.5,'#ff0');
      radial.addColorStop(0.9,'#555');
      radial.addColorStop(1,'#f00');
      漸變可以賦值給fillStyle和strokeStyle。
      注:如果大圓不包含小圓,效果會有問題。      

5.矩形
  填充矩形:
    ctx.fillRect(x,y,width,height); //x,y指左上角的點
  描邊矩形:
    ctx.strokeRect(x,y,width,height)
  類似的:

    fillText, strokeText

 定義矩形路徑,在填充:

  ctx.rect(300,100,50,40);
  ctx.stroke()
  ctx.fill();


6.畫曲線
  有4個函數:arc, arcTo, quadratcCurveTo, bezierCurveTo
  a.arc(正圓):context.arc(x, y, radius, startAngle, endAngle, anticlockwise) //是否逆時針
    ctx.arc(100, 100, 50, 0, Math.PI*2);
    ctx.fill();  //填充
    ctx.stroke(); //描邊
    注:arc的0度就是數學上常用的0度,但是角度默認是順時針張開的,與數學模型相反(跟座標有關,因爲canvas座標也與數學座標相反)
  b.arcTo(正圓弧)
    ctx.moveTo(x0, y0)
    ctx.arcTo(x1,y1,x2,y2,radius) //點1,點2,圓弧半徑
    ctx.strock();
    (x0, y0)、(x1, y1)與(x2, y2)組成夾角,半徑爲radius的圓與該夾角相切,得到一個圓弧,(x0,y0)與第一條線的切點得到一條線段。
  c.quadraticCurveTo(二次弧線)
    ctx.moveTo(x0, y0); //起點
    ctx.quadraticCurveTo(x1,y1,x,y); //(x1,y1)-控制點;(x,y)-終點
    控制點:控制弧線弧度方向。
  d.bezierCurveTo(貝賽爾曲線/貝茲曲線/貝濟埃曲線-應用於二維圖形應用程序的數學曲線)
    ctx.moveTo(x0,y0) //起點
    ctx.bezierCurveTo(x1,y1,x2,y2,x,y); //(x1,y1)即控制點1的座標,(x2,y2)是控制點2的座標,(x,y)是他的終點座標。弧線爲起點到終點,中間弧線偏向控制點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章