HarmonyOS7 UI 实战:PatternLock 九宫格图案锁屏完整实现

用 sketch-notes 手绘笔记风格绘制一张教程型信息图,主题是 HarmonyOS 7 Ar

前言

手势密码解锁是很多 App 的标配——比起输密码,在九宫格上画一个图案更快也更有仪式感。ArkUI 内置了 PatternLock 组件,开箱即用的九宫格手势识别,省去了自己实现触摸轨迹计算的麻烦。

这篇文章用 PatternLock 做一个带预设图案校验的锁屏页面,顺便讲讲这个组件的各种可配置属性。

效果预览

最终效果:

  • 一个 3x3 的九宫格点阵
  • 手指滑动绘制图案,轨迹实时显示
  • 完成后自动校验是否匹配预设图案
  • 支持"设置新图案"模式

布局思路

用 sketch-notes 手绘流程图风格绘制一张 PatternLock 图案校验流程图,主题是

页面结构比较清晰:

Column
├── 标题
├── PatternLock(核心组件)
├── 结果提示文本
├── 预设图案提示
└── 操作按钮(设置新图案 / 重置)

核心就是 PatternLock 组件,其他的都是辅助展示和操作。

逐步实现

用 sketch-notes 手绘笔记风格绘制一张页面结构框架图,主题是 HarmonyOS 7 A

PatternLock 基础配置

PatternLock()
  .sideLength(260)              // 组件边长
  .regularColor('#E0E0E0')      // 未选中点的颜色
  .selectedColor('#4D96FF')     // 选中点的颜色
  .activeColor('#4D96FF')       // 正在触摸的点的颜色
  .pathColor('#4D96FF')         // 轨迹线的颜色

各属性的作用一目了然。sideLength 控制整个九宫格的大小,颜色属性让你可以自定义外观风格。

图案完成回调

最关键的是 onPatternComplete 回调——用户手指抬起时触发,参数是点的索引数组:

.onPatternComplete((input: number[]) => {
  // input 是用户经过的点的索引数组
  // 索引从 0 到 8,对应九宫格从左到右、从上到下
  // 0 1 2
  // 3 4 5
  // 6 7 8
})

图案校验逻辑

预设一个 “Z字形” 图案 [0, 1, 2, 5, 8],在回调中比对:

private savedPattern: number[] = [0, 1, 2, 5, 8]

.onPatternComplete((input: number[]) => {
  const match = input.length === this.savedPattern.length &&
    input.every((v, i) => v === this.savedPattern[i])

  if (this.isSet) {
    this.lockResult = '新图案已设置!'
    this.isSet = false
  } else if (match) {
    this.lockResult = '解锁成功! 图案正确'
  } else {
    this.lockResult = `输入图案: ${input.join('-')} (不匹配)`
  }
})

比较逻辑很简单:长度相同且每个位置的索引都一致就算匹配。

完整页面代码

@Entry
@Component
struct PatternLockPage {
  @State lockResult: string = '请绘制解锁图案'
  @State isSet: boolean = false
  private savedPattern: number[] = [0, 1, 2, 5, 8]

  build() {
    Column() {
      Scroll() {
        Column() {
          Text('PatternLock 图案锁')
            .fontSize(18).fontWeight(FontWeight.Bold).margin({ bottom: 8 })

          Column() {
            Text('手势图案解锁')
              .fontSize(14).fontWeight(FontWeight.Medium).margin({ bottom: 12 })

            Column() {
              PatternLock()
                .sideLength(260)
                .regularColor('#E0E0E0')
                .selectedColor('#4D96FF')
                .activeColor('#4D96FF')
                .pathColor('#4D96FF')
                .onPatternComplete((input: number[]) => {
                  const match = input.length === this.savedPattern.length &&
                    input.every((v, i) => v === this.savedPattern[i])
                  if (this.isSet) {
                    this.lockResult = '新图案已设置!'
                    this.isSet = false
                  } else if (match) {
                    this.lockResult = '解锁成功! 图案正确'
                  } else {
                    this.lockResult = `输入图案: ${input.join('-')} (不匹配)`
                  }
                })
            }
            .width('100%').alignItems(HorizontalAlign.Center)

            Text(this.lockResult)
              .fontSize(14).fontColor('#4D96FF')
              .fontWeight(FontWeight.Medium).margin({ top: 12 })

            Text('预设图案: 0-1-2-5-8 (Z字形)')
              .fontSize(11).fontColor('#666666').margin({ top: 4 })

            Row({ space: 8 }) {
              Button('设置新图案').onClick(() => {
                this.isSet = true
                this.lockResult = '请绘制新解锁图案'
              })
              Button('重置').onClick(() => {
                this.lockResult = '请绘制解锁图案'
                this.isSet = false
              })
            }
            .width('100%').justifyContent(FlexAlign.SpaceEvenly)
            .margin({ top: 12 })
          }
          .width('100%').backgroundColor('#FFFFFF').borderRadius(12).padding(16)
        }
        .width('100%')
      }
      .layoutWeight(1)
    }
    .width('100%').height('100%').backgroundColor('#F5F6FA').padding(16)
  }
}

踩坑记录

坑1:九宫格索引顺序

九宫格的索引是:

0  1  2
3  4  5
6  7  8

从左到右、从上到下。一开始容易搞混,建议先画个草图。

坑2:图案太简单不安全

如果用户只画了两个点(如 0-1),这种"图案"太容易被猜到。可以在 onPatternComplete 中加一个最少点数校验:

if (input.length < 4) {
  this.lockResult = '图案至少需要连接 4 个点'
  return
}

坑3:设置新图案需要二次确认

实际应用中,设置新图案通常需要用户画两次确认一致。这个案例简化了流程,只画一次就设置成功。

写在最后

PatternLock 组件把九宫格手势识别这件事封装得很到位——不用自己处理触摸事件、轨迹计算、碰撞检测。做锁屏、手势密码、手势验证这些需求时,它是一个省心又好用的选择。

随着全民健身事业的深入推进与户外运动的快速普及,定向越野赛事举办频次持续提升,赛事规模与参与人数不断增长,参与者与组织者对赛事组织效率、服务质量及管理规范化的要求日益提高。然而,传统定向越野赛事管理仍依赖人工登记、线下核对、纸质记录等方式,普遍存在信息同步滞后、流程繁琐易错、数据统计低效、成绩核算耗时、资金与签到管理不规范等突出问题。例如,人工报名信息核对易出现遗漏与错误,现场签到排队拥堵影响参赛体验,成绩人工录入误差率高,赛事资金与物资管理缺乏透明化监管。这些问题不仅大幅增加赛事组织成本与人力消耗,还制约赛事运营效率与整体服务水平提升。在此背景下,构建一套数字化、一体化的定向越野赛事管理系统,成为赛事运营主体优化管理模式、提升服务质量的迫切需求。本研究旨在通过信息化技术重构赛事管理全流程,解决传统模式下的信息孤岛与操作低效问题,为定向越野赛事规范化、智能化管理提供可落地的解决方案。 本研究基于 Spring Boot 与 Vue 技术栈,采用前后端分离架构设计并实现了一套定向越野赛事管理系统。技术层面:后端依托 Spring Boot 框架搭建 RESTful API 服务,利用其自动配置与模块化特性简化开发流程,集成 MyBatis-Plus 优化数据持久化操作;前端采用 Vue.js 框架实现组件化开发,通过 Element UI 组件库构建交互友好的可视化界面,利用 Axios 实现前后端数据动态交互;数据库选用 MySQL 保障数据高效存储与事务一致性,同时采用手机号短信验证、JWT 令牌等机制强化系统安全性与用户权限管理。 本系统的实施为定向越野赛事运营与管理提供了显著的现实价值:其一,通过线上报名、信息筛选与自动化核对,大幅降低人工操作误差,提升赛事组织效率 30% 以上;其二,定位打卡签到与实时成绩同步功能,实现参赛流程无纸化、智能化,显著改善参赛者体验;其
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 ARM公司特别为ARM架构的处理器,尤其是STM32系列微控制器,开发了一套高效的数字信号处理软件包。这个软件包内含多种基础的数字信号处理技术,例如快速傅里叶变换(FFT)和比例积分微分(PID)调节器,其目的是辅助开发者在嵌入式环境中达成卓越的音频、图像处理及其他信号处理任务。 FFT(快速傅里叶变换)是一种高效计算离散傅里叶变换(DFT)的方法,在频谱分析、滤波器构造等方面有广泛应用。ARM的DSP软件包所提供的FFT功能通常配备多种尺寸的预制模块,用以满足不同数据长度的需求。使用者能够借助这些功能迅速将时域数据转化为频域数据,从而执行频谱分析或设计滤波器。 PID控制器是一种成熟的控制策略,由比例、积分及微分三个环节构成,用于调节系统的响应性能。在ARM的DSP软件包中,PID控制器的示范程序能够指导开发者如何设定和改善PID参数,以实现系统的高精度控制。使用PID控制器一般需要调节Kp(比例系数)、Ki(积分系数)和Kd(微分系数),以达成所需的响应速度和稳定性。 在"Documentation"这份资料中,应当包含详尽的操作说明、API参考以及可能的示范程序。这些资料会阐释如何在工程中整合并运用ARM DSP软件包,以及各个函数的具体功能和参数说明。例如,它可能会说明如何启动库,设定FFT的输入与输出存储区,以及如何启动和结束FFT运算。对于PID控制器,资料会说明如何建立和配置PID对象,如何更新和获取控制器的状态,以及如何调整增益系数。 在实际项目执行中,掌握这些关键点对于提升嵌入式系统的运作效率至关重要。采用ARM官方的DSP软件包不仅可以增强代码的执行效能,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值