鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock)

项目概述

基于鸿蒙(OpenHarmony)平台开发的手势密码锁应用,旨在为用户提供安全、便捷且具有良好交互体验的身份验证方式。通过手势图案输入,用户可以轻松设置和验证密码,提升设备的安全性和个性化体验。

功能特点

  • 手势密码设置与验证:支持用户自定义手势密码,输入手势后进行验证,保障账户安全。
  • 动态提示与反馈:输入正确或错误时,界面会以不同颜色和动画进行反馈,并通过 Toast 提示用户操作结果。
  • 密码重置:一键重置手势密码,便于用户随时更换密码。
  • 美观的 UI 设计:采用半透明背景、圆形头像、阴影等现代化设计元素,提升视觉体验。
  • 动画与震动反馈:操作过程中配合动画效果,增强交互感。

技术架构

  • 开发平台:OpenHarmony(鸿蒙)
  • 主要语言:ETS(ArkTS)
  • 核心组件
  • PatternLock 手势密码输入组件
  • promptAction 用于 Toast 消息提示
  • vibrator 用于震动反馈(可选)
  • 状态管理:基于@State 实现页面响应式数据绑定
  • UI 布局:采用 Stack、Column 等布局组件,适配多种屏幕尺寸

使用场景

  • 设备解锁:可作为手机、平板等智能设备的解锁方式,提升安全性。
  • 应用内二次验证:适用于金融、隐私类 App 的二次身份验证。
  • 儿童/家庭模式:为特定应用场景(如儿童锁、家长控制)提供便捷的手势解锁方案。
  • 智能家居:可集成到智能门锁、家居控制面板等 IoT 设备中,实现手势开锁。

完整源码

复制代码
import promptAction from '@ohos.promptAction';
import vibrator from '@ohos.vibrator';

@Entry
@Component
struct PatternLockTest {
  @State passwords: Number[] = [1, 3, 4, 5, 7]
  @State message: string = '请验证密码'
  @State messageColor: Color = Color.White
  @State isSuccess: boolean = false
  @State isError: boolean = false
  @State showPattern: boolean = true
  private patternLockController: PatternLockController = new PatternLockController()

  aboutToAppear() {
    // 初始化时确保状态正确
    this.isSuccess = false;
    this.isError = false;
  }

  // 显示状态消息并设置颜色
  showMessage(msg: string, isError: boolean = false, isSuccess: boolean = false) {
    this.message = msg;
    this.isError = isError;
    this.isSuccess = isSuccess;

    if (isError) {
      this.messageColor = Color.Red;
      // 错误时显示提示
      promptAction.showToast({
        message: msg,
        duration: 2000,
        bottom: '70%'
      });
    } else if (isSuccess) {
      this.messageColor = Color.Green; // 成功绿色
      // 成功时显示提示
      promptAction.showToast({
        message: msg,
        duration: 2000,
        bottom: '70%'
      });
    } else {
      this.messageColor = Color.White;
    }
  }

  build() {
    Stack() {
      // 背景图
      Image($r('app.media.background'))
        .width('100%')
        .height('100%')
        .objectFit(ImageFit.Cover)
        .opacity(0.85)

      Column({ space: 20 }) {
        // 顶部标题区域
        Column({ space: 8 }) {
          Image($r('app.media.avatar'))
            .width(80)
            .height(80)
            .borderRadius(40)
            .border({ width: 2, color: Color.White })
            .shadow({
              radius: 10,
              color: 'rgba(0,0,0,0.3)',
              offsetX: 0,
              offsetY: 2
            })
            .animation({
              duration: 500,
              curve: Curve.EaseOut
            })
            .margin({ top: 50, bottom: 20 })

          Text('手势密码')
            .fontSize(28)
            .fontWeight(FontWeight.Bold)
            .fontColor(Color.White)
            .opacity(0.9)
            .shadow({
              radius: 2,
              color: 'rgba(0,0,0,0.3)',
              offsetX: 0,
              offsetY: 1
            })

          Text(this.message)
            .textAlign(TextAlign.Center)
            .fontSize(18)
            .fontColor(this.messageColor)
            .fontWeight(this.isError || this.isSuccess ? FontWeight.Bold : FontWeight.Normal)
            .opacity(0.9)
            .animation({
              duration: 300,
              curve: Curve.EaseInOut
            })
        }
        .width('100%')
        .alignItems(HorizontalAlign.Center)

        // 手势密码区域
        if (this.showPattern) {
          Column() {
            PatternLock(this.patternLockController)
              .sideLength(300)            // 设置宽高
              .circleRadius(10)           // 设置圆点半径
              .regularColor(Color.Gray)    // 设置圆点颜色
              .activeColor(Color.Blue)     // 设置激活状态的颜色
              .selectedColor(this.isError ? Color.Red : (this.isSuccess ? Color.Green : Color.Blue)) // 根据状态设置颜色
              .pathColor(this.isError ? Color.Red : (this.isSuccess ? Color.Green : Color.Blue))     // 根据状态设置路径颜色
              .pathStrokeWidth(8)         // 设置连线粗细
              .backgroundColor('rgba(255, 255, 255, 0.15)') // 半透明背景
              .autoReset(true)            // 支持用户在完成输入后再次触屏重置组件状态
              .onPatternComplete((input: Array<number>) => {
                console.log(input.join(','));

                if (input == null || input == undefined || input.length < 5) {
                  this.showMessage("密码长度至少为5位数。", true);
                  return;
                }

                if (this.passwords.length > 0) {
                  if (this.passwords.toString() == input.toString()) {
                    this.passwords = input;
                    this.showMessage("密码验证成功", false, true);

                    // 成功动画效果
                    this.showPattern = false;
                    setTimeout(() => {
                      this.showPattern = true;
                      this.isSuccess = false;
                    }, 100);
                  } else {
                    this.showMessage('密码输入错误', true);
                  }
                } else {
                  this.passwords = input;
                  this.showMessage("密码设置成功", false, true);
                }
              })
              .shadow({
                radius: 15,
                color: 'rgba(0,0,0,0.2)',
                offsetX: 0,
                offsetY: 5
              })
              .animation({
                duration: 500,
                curve: Curve.EaseOut
              })
          }
        }

        // 底部按钮区域
        Button('重置密码')
          .fontSize(18)
          .fontWeight(FontWeight.Medium)
          .height(50)
          .width(200)
          .borderRadius(25)
          .backgroundColor('rgba(255, 255, 255, 0.2)')
          .fontColor(Color.White)
          .shadow({
            radius: 8,
            color: 'rgba(0,0,0,0.2)',
            offsetX: 0,
            offsetY: 4
          })
          .onClick(() => {
            this.passwords = [];
            this.showMessage('请设置新的手势密码');
            this.patternLockController.reset();
          })
          .stateEffect(true)
          .margin({ top: 30 })
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.SpaceEvenly)
      .alignItems(HorizontalAlign.Center)
    }
  }
}

鸿蒙系统(HarmonyOS)应用开发之手势锁屏密码锁(PatternLock) - 高质量源码分享平台-免费下载各类网站源码与模板及前沿动态资讯

相关推荐
一只大侠的侠5 小时前
Flutter开源鸿蒙跨平台训练营 Day 10特惠推荐数据的获取与渲染
flutter·开源·harmonyos
崔庆才丨静觅7 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅8 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅8 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅9 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊9 小时前
jwt介绍
前端