# Tablet
> Tablet是一个轻量级的基于canvas的在线画板，无其他依赖，`传统网站`或`vue`、`react`、`angular`等单页面应用皆可使用！兼容各种移动设备！

Tablet is a lightweight canvas-based online drawing board with no other dependencies. It can be used by `traditional websites` or single-page applications such as `vue`, `react`, and `angular`! Compatible with all kinds of mobile devices!

## canvas签名板文档
这是<code>Tablet2.0</code>文档，Tablet1.0文档请前往 

[Tablet1.0文档](https://github.com/941477276/Tablet/blob/master/README.md)

## 安装(Install)
1. **npm安装：**
`npm install canvas-tablet -S`
2. **script标签引入：**
`将/dist/Tablet-2.0.1.min.js下载下来即可`


## 演示地址(Demo)
### https://941477276.github.io/Tablet/index2.html

## 基本使用(Usage)
```
<div class="tool-bar">
  <div class="tablet-btns" style="padding: 10px;">
    <input class="-color-picker color-color" type="text" value="字体颜色" id="colpick" readonly/>
    <input class="-color-picker bg-color" type="text" value="背景颜色" id="colpick2" readonly/>
    <div class="clear-canvas">清屏</div>
    <div class="save-canvas-to-img">保存图片</div>
    <span>
         画笔粗细
         <select>
             <option value="1">1</option>
             <option value="3">3</option>
             <option value="5">5</option>
             <option value="8">8</option>
             <option value="10" selected>10</option>
             <option value="15">15</option>
             <option value="20">20</option>
         </select>
         <!--<select>
             <option value="0">正常</option>
             <option value="90">顺时针旋转90度</option>
             <option value="-90">逆时针旋转90度</option>
             <option value="180">旋转180度</option>
         </select>-->
         <button type="button" class="get_blob">获取blob对象</button>
         <button type="button" class="set-img">设置背景图片</button>
         <button type="button" class="backOneStep">撤回</button>
    </span>
  </div>
</div>

<div class="container" id="container"></div>
<script src="./dist/Table.2.0.1.min.js"></script>  
<script>
  var tablet;
  $(function () {
    tablet = new Tablet("#container", {
      // 画笔默认颜色
      defaultColor: "#2e76da",
      // 默认背景色
      defaultBackgroundColor: '#f60',
      // canvas画布是否响应式
      // response: true,
      // canvas的宽度，宽高都可以传递函数
      // width: 0,
      // height: 0,
      // 前面板的额外class
      // extraClass: "",
      // 设置获取到的图片的类型，可选值png、jpg，默认png
      // imgType: "png",
      // 清除画布前执行的函数，如果该函数返回false，则不会进行清除
      // onBeforeClear: function () {},
      // 清除画布后执行的函数
      // onClear: function () {},
      autoResize: true, // 浏览器窗口改变时是否重新绘制
      // 画布初始化后的回调
      onInit: function () {
        var that = this,
          container = this.container;
        $(".-color-picker").each(function () {
          var self = this,
            $self = $(this);
          if ($self.hasClass('color-color')) {

            $self.colpick({
              color: that.config.defaultColor,
              layout: 'hex',
              submitText: "确定",
              onSubmit: function (hsb, hex, rgb, el, bySetColor) {
                var color = "#" + hex;
                $(el).css({
                  //color: color,
                  "border-color": color
                }).colpickHide();
                el.selectedColor = color;
                that.color = color;

                that.setColor(color);
              }
            });
            $self.css({
              "border-color": that.config.defaultColor
            });
          } else if ($self.hasClass('bg-color')) {
            $self.colpick({
              color: that.config.defaultBackgroundColor,
              layout: 'hex',
              submitText: "确定",
              onSubmit: function (hsb, hex, rgb, el, bySetColor) {
                var color = "#" + hex;
                $(el).css({
                  //color: color,
                  "border-color": color
                }).colpickHide();
                el.selectedColor = color;
                //that.bgColor = color;
                that.setBackgroundColor(color);
                // 重绘背景图后必须刷新一下，否则偶尔会出现最后一个线条被重复绘制一遍问题
                var timer = setTimeout(function (){
                  clearTimeout(timer);
                  that.refresh();
                }, 0);
              }
            });
            $self.css({
              "border-color": that.config.defaultBackgroundColor
            });
          }
        });
        $('.clear-canvas').on('click', function () {
          that.clear();
        })
        $(".tablet-btns select").eq(0).on("change", function () {
          that.setLineWidth($(this).val());
        });
        $(".save-canvas-to-img").on("click", function () {
          console.log(that.getBase64());
          if (!that.isMobile) {
            alert("请按f12打开控制台查看base64图片数据！");
          }
        });
        $(".get_blob").on("click", function () {
          console.log(that.getBlob());
        });
        $(".set-img").on("click", function () {
          that.setBackgroundImage(document.getElementById('bg_img'));
          // 重绘背景图后必须刷新一下，否则偶尔会出现最后一个线条被重复绘制一遍问题
          var timer = setTimeout(function (){
            clearTimeout(timer);
            that.refresh();
          }, 0);
        });
        $(".backOneStep").on('click', function () {
          that.revoke();
        });
      }
    });
    console.log(tablet);
  });
</script>
```
  <p>效果如图：</p>
  
  ![Table画板效果](./images/tablet2.0_effect.gif)
  
  <div class="pt-20"></div>

## 实例方法(Methods)
> `refresh(refreshWH)`

刷新画布，线条及背景将会重绘，返回当前Tablet实例；如果`refreshWH`为true，则会重新计算画布宽高

> `hasCanUseLine`

判断是否有可用的线条，可以用来判断用户是否有绘制内容，返回值类型：`boolean`

> `getRect`

获取画布位置及宽高；返回值类型：`{x: number, width: number, y: number, height: number}`

> `getBase64(type, angle)`

将画布内容转换成base64数据，并返回；返回值类型：`string`
+ `type`：图片类型，只有`jpg`、`png`两个选项，默认`png`
+ `angle`：旋转角度，默认为0，角度支持**90的整数倍**

> `getBlob(type, angle)`

将画布内容转换成blob数据，并返回；返回值类型：`blob`
+ `type`：图片类型，只有`jpg`、`png`两个选项，默认`png`
+ `angle`：旋转角度，默认为0，角度支持**90的整数倍**

> `getMax(xPoints, yPoints)`

获取x、y轴的最大、最小值；`xPoints, yPoints`分别为x轴、y轴所有坐标；返回值类型：`{top: number, left: number, bottom: number, right: number}`

> `setColor(color)`

设置画笔颜色；`color`为颜色值，可以是任何css的颜色表达式；返回当前Tablet实例

> `setLineWidth(width)`

设置画笔粗细；`width`为粗细值，`number类型`；返回当前Tablet实例

> `setBackgroundColor(bgColor, x, y, width, height, addToOperationRecord)`

设置画布背景颜色；返回当前Tablet实例

1. `bgColor`：颜色值，可以是任何css的颜色表达式
2. `x`：绘制起始x点，默认为0
3. `y`：绘制起始y点，默认为0
4. `width`：绘制宽度，默认为整个画布宽度
5. `height`：绘制高度，默认为整个画布高度
6. `addToOperationRecord`：是否将此操作添加到操作历史中，默认为true

> `setBackgroundImage(img, x, y, width, height, onImgLoading, onFail, addToOperationRecord)`

设置画布背景颜色；返回当前Tablet实例

1. `img`：背景图片，值可以为图片url或者Image对象
2. `x`：绘制起始x点，默认为0
3. `y`：绘制起始y点，默认为0
4. `width`：绘制宽度，默认为整个画布宽度
5. `height`：绘制高度，默认为整个画布高度
6. `onImgLoading`：图片加载中回调
7. `onFail`：图片加载失败回调
8. `addToOperationRecord`：是否将此操作添加到操作历史中，默认为true

> `setCanvasWH(width, height)`

设置画布的宽高；`width, height`分别为画布宽高，如果不传宽高则会自动计算；返回当前Tablet实例

> `canvasReset`

重置canvas画笔属性，使用最后一次的属性进行重置，返回当前Tablet实例；

> `revoke`

回退一步，返回当前Tablet实例；


> `clear(clearPoints)`

  `clear`方法用于清空画布，返回值当前Tablet实例；如果`clearPoints`为true，则会将之前绘制的线条及操作步骤清空

> `hasContent(singleColorCountMin, totalColorCountMin)` v2.0.5新增

判断画布是否有内容，画布中有可用线条或画布中颜色数量大于等于`totalColorCountMin`都认为有内容

1. `singleColorCountMin`：单个颜色最少数量，默认5
2. `totalColorCountMin`：总颜色数量，默认为2

> `getTabletImageColors` v2.0.5新增

获取画布中内容的颜色（16进制）
