【HarmonyOS 5】鸿蒙实现手写板

GeorgeGcs
• 阅读 10

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言 实现一个手写板功能,基本思路如下: 创建一个可交互的组件,用户在屏幕上触摸并移动手指时,会根据触摸的位置动态生成路径,并使用黑色描边绘制在屏幕上。当用户按下屏幕时,记录按下点的坐标作为路径的起点。当用户移动手指时,不断记录移动点的坐标,通过线段连接起来形成路径。 功能效果图如下所示:

二、方案思路 系统提供了非常便捷的画线组件Path。该组件将画布和画线功能合二为一。提供了简洁的画线组件。 详情参见,官方组件API文档链接:Path-图形绘制-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者 【https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-drawing-components-path】 Path该组件的使用思路很简单,如下代码所示: Path() .commands(this.pathCommands) // 设置SVG路径描述字符串 .strokeWidth(5) // 设置路径的描边宽度为 5 .fill("none") // 设置路径的填充颜色为无 .stroke(Color.Black) // 设置路径的描边颜色为黑色 .height('100%') .width('100%')

  1. 将组件的宽高设置需要展示的画布区域大小。 height和width为百分之百。
  2. 设置线的样式颜色和宽度。 stroke为Color.Black,strokeWidth为5
  3. 设置绘制闭合的填充区域的颜色。 fill为none 若你修改了fill有填充色,就会得到如下的效果:

因为该效果并非手写板的需求,所以需要设置fill为none,不要填充色。 4. 设置SVG路径描述字符串。 该组件最核心的属性。它的值是字符串大概是这样的: M225.99999999999997 409.99999999999994 L225.99999999999997 409.99999999999994

首先我们先了解SVG 路径描述符是干嘛的? SVG 路径描述符是用于定义矢量图形路径的一组命令,在使用Path组件绘制图形时发挥关键作用,可创建各种复杂的自定义形状。主要作用如下:

(1)构建基础图形: 通过M(moveto)命令确定起始点,配合L(lineto)、H(horizontal lineto)、V(vertical lineto)等命令绘制直线段,能构建出三角形、矩形等基础图形。例如commands('M0 20 L50 50 L50 100 Z')定义了一个起始于(0,20),通过绘制两条直线段,最后用Z(closepath)命令关闭路径形成的三角形 。 (2)绘制曲线图形: 借助C(curveto)、S(smooth curveto)、Q(quadratic Belzier curve)、T(smooth quadratic Belzier curveto)等命令,能绘制不同类型的贝塞尔曲线,实现复杂的曲线图形绘制。像C100 100 250 100 250 200可绘制一条从当前点到(250, 200)点的三次贝塞尔曲线,用于创建诸如花瓣、波浪线等曲线形状。 (3)绘制椭圆弧: A(elliptical Arc)命令用于从当前点到指定点绘制椭圆弧,通过设置椭圆的半径、旋转角度以及其他标志位,能绘制各种椭圆形状的部分弧线,比如绘制饼图的扇区。

而在手写板场景中,SVG 路径描述符仅使用M(moveto)和L(lineto)命令就能实现主要功能。 原因在于手写板的核心需求是实时记录并呈现用户绘制的轨迹。M命令用于确定绘制轨迹的起始点,每次用户触摸屏幕开始书写时,就相当于启动一个新的路径,M命令记录下这个起始坐标,如同在纸上确定第一笔的落点。L命令从当前点到指定坐标画一条线,在手写板中,随着用户手指的移动,不断获取移动过程中的坐标点,通过L命令依次连接这些点,就能形成连续的线条,精准地呈现出手写的笔迹。 最终我们只需要在Path组件外添加onTouch事件 记录用户的手指触摸事件,得到其x,y坐标,即可实现手写板的svg路径描述符: // 处理触摸事件的方法 onTouchEvent(event: TouchEvent) { // 根据触摸事件的类型进行不同的处理 switch (event.type) { // 当触摸类型为按下时 case TouchType.Down: // 在 pathCommands 中添加一个移动命令(M),并记录按下点的坐标 this.pathCommands += 'M' + event.touches[0].x + ' ' + event.touches[0].y; break; // 当触摸类型为移动时 case TouchType.Move: // 在 pathCommands 中添加一个线段命令(L),并记录移动点的坐标 this.pathCommands += 'L' + event.touches[0].x + ' ' + event.touches[0].y; break; // 其他触摸类型,不做处理 default: break; } }

  1. 当需要清空手写板。 只需要对Path组件的commands属性设置为空字符串即可。 三、源码示例: @Entry @Component struct PathTestPage {

    @State pathCommands: string = "";

    private setPathCommands(str: string, event: TouchEvent){ let x = event.touches[0].x; let y = event.touches[0].y; this.pathCommands += str + vp2px(x) + ' ' + vp2px(y); console.log("georgeDebug", " this.pathCommands: " + this.pathCommands); }

    onTouchEvent(event: TouchEvent){ // event xy 单位:vp switch (event.type){ case TouchType.Down:

     this.setPathCommands('M', event);
     break;

    case TouchType.Move:

     this.setPathCommands('L', event);
     break;
     default:
       break;

    } }

    build() { Stack({ alignContent: Alignment.TopStart }){ Path()

     .commands(this.pathCommands) // 设置SVG路径描述字符串
     .strokeWidth(5) // 设置路径的描边宽度为 5
     .fill("none") // 设置路径的填充颜色为无
     .stroke(Color.Black) // 设置路径的描边颜色为黑色
     .height('100%')
     .width('100%')
     .onTouch((event: TouchEvent)=>{
       this.onTouchEvent(event);
     })

    Button("清空绘制")

     .onClick(()=>{
       this.pathCommands = "";
     })

    } .height('100%') .width('100%')

    } }

注意:

  1. 因为path不能作为build的根节点,所以用容器组件row进行了包裹。
  2. onTouch得到的坐标xy单位为vp,而svg描述符的单位为vp,所以数值要做单位转化。否则会造成能画出东西, 但是坐标跟下笔的位置都缩小了。
  3. 需要给path组件设置宽高,否则会不显示。
点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
17小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
17小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言图(11)HarmonyOS系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。其核心能力包括:扫描合同、票据、会议记录并保存为PDF分享。拍摄课堂PPT、书
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、UIAbility是什么?Stage模型中的组件类型名,即UIAbility组件,包含UI,提供展示UI的能力,主要用于和用户交互。UIAbility类似于传统移动开发Android中
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】桌面快捷方式功能实现详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在移动应用开发中,如何让用户快速触达核心功能,是目前很常见的功能之一。鸿蒙系统提供的桌面快捷方式(Shortcuts)功能,允许开发者为应用内常用功能创建直达入口,用户通过长按应用
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
8小时前
鸿蒙 6.0 引爆 AI 智能体革命:从交互重构到全场景智能觉醒,未来已至
【HarmonyOS5】鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言今天的华为开发者大会(2025HDC),全程看完,我只想说,震撼对于用户来说,一个未来场景的手机操作系统,正在诞生,从文本交互的操作转向自然语言,未来手机用
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS中使用openCustomDialog自定义弹框时,我们会遇到实现禁止手势关闭弹框的业务场景。虽然在HarmonyOSNext中,自定义Dialog默认可能继承
GeorgeGcs GeorgeGcs
7小时前
【HarmonyOS 5】鸿蒙用户头像编辑功能实践
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言1、应用背景在鸿蒙化开发过程中,我们发现最基本常见的功能用户头像的编辑,实现方式和Android与IOS有极大的不同。在实际开发和调研的过程中,我们发现并总结了鸿蒙隐私处理与业内A
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2