HarmonyOS 鸿蒙Next 想实现手签功能,有对应的案例么

发布于 1周前 作者 eggper 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 想实现手签功能,有对应的案例么

想实现手签功能,有对应的案例么 

2 回复

可以用Canvas来实现效果,可以尝试下如下demo,具体样式自己设计

import { image } from '[@kit](/user/kit).ImageKit';

import { BusinessError } from '[@kit](/user/kit).BasicServicesKit';

import { componentSnapshot } from '[@kit](/user/kit).ArkUI';

[@Entry](/user/Entry)

[@Component](/user/Component)

struct SignatureBoard {

  private lastX: number = 0;

  private lastY: number = 0;

  private isDown: Boolean = false;

  private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All, distance: 1 })

  private settings: RenderingContextSettings = new RenderingContextSettings(true)

  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)

  [@State](/user/State) componentSnapshotPixelMap: image.PixelMap | null = null;

  draw(startX: number, startY: number, endX: number, endY: number) {

    // 起点

    this.context.moveTo(startX, startY);

    // 终点

    this.context.lineTo(endX, endY);

    // 调用 stroke,即可看到绘制的线条

    this.context.stroke();

  }

  build() {

    Column() {

      Text("签名返回图:").width("90%").fontSize(16).textAlign(TextAlign.Start)

      Image(this.componentSnapshotPixelMap).size({ width: "90%", height: 200 }).margin({ bottom: 20 })

      Text("签名板:").width("90%").fontSize(16).textAlign(TextAlign.Start)

      Canvas(this.context)

        .width('90%')

        .height(200)

        .borderWidth(1)

        .margin({ bottom: 20 })

        .id("signature")

        .backgroundColor('#fff')

        .onReady(() => {

          this.context.lineWidth = 3;

          this.context.strokeStyle = "#000";

        })

        .gesture(

          PanGesture(this.panOption)

            .onActionStart((event: GestureEvent) => {

              this.isDown = true;

              // 按下时的点作为起点

              this.lastX = event.fingerList[0].localX;

              this.lastY = event.fingerList[0].localY;

              // 创建一个新的路径

              this.context.beginPath();

            })

            .onActionUpdate((event: GestureEvent) => {

              // 没有按下就不管

              if (!this.isDown) {

                return;

              }

              const offsetX = event.fingerList[0].localX

              const offsetY = event.fingerList[0].localY

              // 调用绘制方法

              this.draw(this.lastX, this.lastY, offsetX, offsetY);

              // 把当前移动时的坐标作为下一次的绘制路径的起点

              this.lastX = offsetX;

              this.lastY = offsetY;

            })

            .onActionEnd(() => {

              this.isDown = false;

              // 关闭路径

              this.context.closePath();

            })

        )

      Divider()

      Row({ space: 20 }) {

        Button("确定").onClick(() => {

          try {

            componentSnapshot.get("signature", (error: Error, pixmap: image.PixelMap) => {

              if (error) {

                console.log("error: " + JSON.stringify(error))

                return;

              }

              this.componentSnapshotPixelMap = pixmap

            }, { scale: 1, waitUntilRenderFinished: true })

          } catch (err) {

            console.error("errCode:" + (err as BusinessError).code + ",errMessage:" + (err as BusinessError).message);

          }

        })

        Button("清空").onClick(() => {

          this.context.clearRect(0, 0, this.context.width, this.context.height)

        })

      }

    }

    .width('100%')

    .height('100%')

  }

}

更多关于HarmonyOS 鸿蒙Next 想实现手签功能,有对应的案例么的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next实现手签功能案例

HarmonyOS 鸿蒙Next确实支持实现手签功能,以下是一个具体的案例说明:

你可以使用Canvas组件来实现手写签名功能。首先,需要创建一个Canvas画布,并设置其大小、背景颜色等属性。然后,通过监听手势事件(如按下、移动、松开等)来捕捉用户的签名动作。在事件处理函数中,使用Canvas的绘图API(如moveTo、lineTo、stroke等)来绘制签名。当用户完成签名后,可以将Canvas的内容转换为图像格式进行保存或展示。

此外,为了增强用户体验,还可以添加一些辅助功能,如清空签名板、确认签名等。这些功能可以通过添加按钮控件并绑定相应的事件处理函数来实现。

需要注意的是,在实现过程中要确保Canvas的绘图上下文(Context)正确配置,以及手势事件的监听和处理逻辑准确无误。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部