Skip to content

签字板 sp-sign-board

签字板,可添加背景图或动态水印,可适配横竖屏,并将签名生成 base64 格式图片

主要功能

  1. 签字签名
  2. 可添加背景图片和水印
  3. 适配横竖屏
  4. 生成图片
  5. 兼容 H5、App、小程序

强烈建议优先前往 插件市场 导入示例项目参考一下。 示例工程中插件可能不是最新版本,运行之前建议先将示例工程中插件更新至最新版本哦。

安装

  1. 插件市场 中点击 下载插件并导入HBuildeX

插件兼容性

✔️ 实测可行 ❌ 未兼容 ➖ 未实测

Vue2Vue3H5App微信小程序支付宝小程序
✔️✔️✔️✔️✔️

提示

支付宝小程序未实测但理论可行,如有问题还请在群里反馈讨论。

prop 参数

参数类型默认值必填说明
sidStringsign-board签字板 id,用于多签名场景下作为区分
bgImgString背景水印图,优先级大于 bgColor
bgColorString背景纯色底色,为空则透明
horizontalBooleanfalse是否横屏
showMarkBooleantrue是否显示水印
markTextArray[]水印内容,可多行,示例 ['水印 1', '水印 2']
markStyleObject详见 markStyle 水印样式水印样式
penStyleObject详见 penStyle 画笔样式画笔样式
expFileObject详见 expFile 导出图片配置导出图片配置
needBackBooleantrue确认签名后是否需要自动触发返回
popupModeBooleanfalse是否是弹窗模式(弹窗模式关闭自带控制栏),开启弹窗模式建议关闭 needBack

markStyle 水印样式

参数类型默认值说明
fontSizeNumber12水印字体大小,单位 px
fontFamilyStringmicrosoft yahei水印字体
colorString#cccccc水印字体颜色
rotateNumber60水印旋转角度
stepNumber2.2步长,部分场景下可通过调节该参数来调整水印间距,建议为 1.4-2.6 左右

penStyle 画笔样式

参数类型默认值说明
lineWidthNumber3画笔线宽 建议 1~5
colorString#000000画笔颜色

expFile 导出图片配置

参数类型默认值说明
fileTypeStringpngpng/jpg (png 不可压缩质量,支持透明;jpg 可压缩质量,不支持透明)
qualityNumber1压缩质量,范围 0 - 1 (仅 jpg 支持)

emit 事件

事件名参数说明
cancel取消按钮回调
reset重写按钮回调
confirm确认按钮回调
firstTouchStart第一次开始触碰事件

uni.$emit 事件

事件名参数说明
getSignImge:{ base64, path, sid } 生成签字图片的 base64、临时路径、以及签字板 sid(多签字板同时存在时,可以通过 sid 来作区分处理)确认签名后触发

使用示例

vue
<template>
  <view class="sign">
    <sp-sign-board ref="signBoardRef" sid="sign-board" horizontal bgColor="#ffffff" :mark-text="markText" @reset="reset" @firstTouchStart="firstTouchStart"></sp-sign-board>
  </view>
</template>

<script>
export default {
  data() {
    return {
      markText: ''
    }
  },
  onLoad() {
    // 生成水印内容
    this.refreshMark()
  },
  methods: {
    refreshMark() {
      const currentDate = new Date()
      const year = currentDate.getFullYear()
      const month = String(currentDate.getMonth() + 1).padStart(2, '0')
      const day = String(currentDate.getDate()).padStart(2, '0')
      const hours = String(currentDate.getHours()).padStart(2, '0')
      const minutes = String(currentDate.getMinutes()).padStart(2, '0')
      const seconds = String(currentDate.getSeconds()).padStart(2, '0')

      this.markText = [`${year}-${month}-${day}`, `${hours}:${minutes}:${seconds}`]
    },
    firstTouchStart() {
      // 在第一次开始触碰时,更新一下时间水印,防止滞留时间太长造成时间误差(非必要)
      this.refreshMark()
      // 手动调用组件内绘制水印方法重新绘制
      this.$refs.signBoardRef.drawMark(this.markText)
    },
    reset() {
      this.refreshMark()
    }
  }
}
</script>
vue
<template>
  <view class="sign">
    <sp-sign-board ref="signBoardRef" sid="sign-board" horizontal bgColor="#ffffff" :mark-text="markText" @reset="reset" @firstTouchStart="firstTouchStart"></sp-sign-board>
  </view>
</template>

<script setup>
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'

const markText = ref([])
const signBoardRef = ref()

onLoad(() => {
  refreshMark()
})

function refreshMark() {
  const currentDate = new Date()
  const year = currentDate.getFullYear()
  const month = String(currentDate.getMonth() + 1).padStart(2, '0')
  const day = String(currentDate.getDate()).padStart(2, '0')
  const hours = String(currentDate.getHours()).padStart(2, '0')
  const minutes = String(currentDate.getMinutes()).padStart(2, '0')
  const seconds = String(currentDate.getSeconds()).padStart(2, '0')

  markText.value = [`${year}-${month}-${day}`, `${hours}:${minutes}:${seconds}`]
}

function firstTouchStart() {
  // 在第一次开始触碰时,更新一下时间水印,防止滞留时间太长造成时间误差(非必要)
  refreshMark()
  // 手动调用组件内绘制水印方法重新绘制
  signBoardRef.value.drawMark(markText.value)
}

function reset() {
  refreshMark()
}
</script>

注意事项

  1. 尽量不要在 movable-view 中使用,当放大缩小的时候可能会导致签名错位偏移的情况。

  2. 在平板设备上开发时,请自行调整横竖屏,以便导出的图片尺寸合适。

疑难解答

可新建 Issue / 悬赏发起提问

  1. 把签字面板放进了弹窗中,第一次打开弹窗签字正常,关闭弹窗后再打开就不正常了。

    • 有可能是签字板渲染与销毁异常导致的,需要你在关闭弹窗时将签字板给 v-if="false" 销毁掉,开启后重新渲染一下。
  2. 弹窗模式 popupMode 开启后,建议关闭自动返回 needBack,弹窗模式下自带的控制栏将会隐藏,此时需要你自定义控制按钮,可以参考示例工程中示例二。

警告

在微信小程序端,开启弹窗模式时要注意签字板的初始化与销毁,具体可参考示例工程中示例二。否则会导致 canvas 初始化失败,宽高为 0 导致无法生成签名的问题(微信小程序实属坑)。

切记在确认签字后切勿立马关闭弹窗,需要等正确获取到签字数据后再关闭弹窗,否则签字图片还没生产完成,canvas 就被关掉了导致无法正常获取签字图片。

写在最后

若对插件有任何疑问或者优化建议,欢迎在 插件评论区 留言,在插件市场中的私信消息本人可能不经常留意,导致没能及时回复, 可以加入本人的插件问答 QQ 交流群: 852637893,欢迎 进群交流

写文档码字感觉真累啊,果然最讨厌的两件事:一是找到合适的插件没文档,二是自己写的插件要自己写文档了*(:з」∠)*。如果有帮助到您,希望能 鼓励一下 吧~ 谢谢 ♪(・ω・)ノ

交流群:852637893