Web

JS中konva第三方绘制库的使用

2019-10-10  本文已影响0人  追逐_chase
web.jpeg

1. Konva特点

* 小巧、使用方便、适合移动端和pc端
* 支持丰富的事件处理操作
* 支持类似JQuery的操作方式
* 开源,可以随意更改
* 社区更新比较活跃,github托管源码
* 性能也不错

2. Konva的基本使用

2.1 创建要绘制的容器
    <body>
        <div id="con"></div>

    </body>
2.2 引入Konva库和使用
<script src="JS/konva.js"></script>
//创建一个 舞台
    var stage = new Konva.Stage({
        width:window.innerWidth,
        height:window.innerHeight,
        container:"con"   //需要存放舞台的Dom容器
    });

//第二步:创建层
var layer = new Konva.Layer();  //创建一个层
stage.add(layer);               //把层添加到舞台

//3.创建组

    //对象里面传入配置参数
    //如果对象里面 设置了 x,y那么在绘制图层的时候
    // 这个x,y就是坐标原点,绘制图形的参考点
    var group =  new  Konva.Group({

    });
// 把组添加到 绘制层
    layer.add(group);

//创建要绘制的 图形
    var rect = new Konva.Rect({     //创建一个矩形
            x: 100,                     //矩形的x坐标,相对其父容器的坐标
            y: 100,
            width: 100,                 //矩形的宽度
            height: 100,                //矩形高度
            fill: 'gold',               //矩形填充的颜色
            stroke: 'navy',             //矩形描边的颜色
            strokeWidth: 4,             //填充宽度
            opactity: .2,               //矩形的透明度
            scale: 1.2,                 //矩形的缩放 1:原来大小
            rotation: 30,               //旋转的角度,是deg不是弧度。
            cornerRadius: 10,           //圆角的大小(像素)
            id: 'rect1',                //id属性,类似dom的id属性
            name: 'rect',
            draggable: true             //是否可以进行拖拽
    });
    

//添加到组中
group.add( rect );  //把矩形添加到组中

//绘制
layer.draw();       //绘制层到舞台上

<script type="text/javascript">
    
    //创建一个 舞台
    var stage = new Konva.Stage({
        width:window.innerWidth,
        height:window.innerHeight,
        container:"con"
    });

    //2.创建绘制层
    var layer = new Konva.Layer();

    //把配置层添加到 舞台上
    stage.add(layer);

    //3.创建组

    //对象里面传入配置参数
    //如果对象里面 设置了 x,y那么在绘制图层的时候
    // 这个x,y就是坐标原点,绘制图形的参考点
    var group =  new  Konva.Group({

    });

    // 把组添加到 绘制层
    layer.add(group);

    //4.绘制一个矩形

    //原生的canvas在平移,缩放的时候都会对x,y有影响,但是Konva 没有
    var rect = new  Konva.Rect({
        x:200,
        y:200,
        height:100,
        width:200,
        //填充颜色
        fill:"red",
        //描边颜色
        stroke:"blue",
        strokeWidth:10,
        //是否可以推动
        draggable:true,
        scaleX:2,
        scaleY:2,
        dash:[1,1]
        //是否可见
        // visible:false

    });
    //添加到组里面
    group.add(rect);


     var circle = new Konva.Circle({
          x:100,
          y:100,
           radius: 40,
           fill: 'red',
          stroke: 'black',
           strokeWidth: 5
     });

     group.add(circle);


    // 创建五角星
    var star = new Konva.Star({
        x: 200,
        y: 400,
        numPoints: 5,
        //内圆的半径
        innerRadius: 30,
        //外圆的半径
        outerRadius: 70,
        fill: 'red',
        stroke: 'black',
        strokeWidth: 4,
        draggable : true
    });

    group.add(star);


    //5.绘制到图层
    layer.draw();

    
    
</script>


image.png
<script type="text/javascript">
    //1.创建舞台
    var stage = new  Konva.Stage({
        width:window.innerWidth,
        height:window.innerHeight,
        container:"con"
    });

    //2.创建绘制层
    var layer = new  Konva.Layer();

    stage.add(layer);

    //3.创建矩形

    var progress = new  ProgressBar({
        x:1/8 * stage.width(),
        y:1/2 * stage.height(),
        width: 3/4 * stage.width(),
        height:1/15 * stage.height(),
        strokeColor:"#ccc",
        fillColor:"red",
        strokeWidth:1,
        value:0.1,
        cornerRadius:5.0

    });
    //绘制
    progress.render(layer);

    layer.draw();

  progress.update(function () {
      console.log("1111");
  });
  


</script>


function ProgressBar(option) {

        this._init(option)

 };

 ProgressBar.prototype = {
     constructor:ProgressBar,
     _init:function (option) {
         option = option||{};
         //坐标点
         this.x = option.x || 0;
         this.y = option.y || 0;
         this.width = option.width||0;
         this.height = option.height ||0;
         //颜色
         this.fillColor = option.fillColor || "black";
         this.strokeColor = option.strokeColor||"black";
         this.strokeWidth = option.strokeWidth || 1;
         //进度值
         this.value = option.value || 0.1;
         //圆角
         this.cornerRadius = option.cornerRadius;
     },
     //绘制
     render:function (layer) {
        this.group = new Konva.Group();
        layer.add(this.group);

        //绘制内部矩形

         var innerRect = new Konva.Rect({
             x:this.x,
             y:this.y,
             //宽度按比例
             width:this.width * this.value,
             height:this.height,
             fill:this.fillColor,
             id:"innerRect"
         });

         this.group.add(innerRect);

         //绘制外部矩形

         var outRect = new  Konva.Rect({
             x:this.x,
             y:this.y,
             width:this.width,
             height:this.height,
             stroke:this.strokeColor,
             strokeWidth:this.strokeWidth,
             //圆角属性
             cornerRadius:this.cornerRadius
         });

         this.group.add(outRect);



     },
     update:function (fn) {
         //获取到内部矩形
         var recct = this.group.findOne("#innerRect");
         //更改this
         var that = this;
         that.fn = fn;
         //内部矩形做动画
         recct.to({
             width:this.width,
             duration:3,
             onFinish:function () {
                 //更改thisde的指向
                 if (typeof that.fn == "function"){
                     that.fn();
                 }
             }

         });
     }
 };
Untitled.gif
上一篇下一篇

猜你喜欢

热点阅读