iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >基于Flutter实现手势密码加密与解锁功能
  • 699
分享到

基于Flutter实现手势密码加密与解锁功能

2024-04-02 19:04:59 699人浏览 泡泡鱼
摘要

目录前言1、绘制静态图形2、存储手势密码数据3、添加手势交互4、绘制、刷新密码线5、加入密码错误动画总结前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波

前言

密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波斯帝国背叛,导致古希腊和斯巴达两败俱伤,这时斯巴达抓了一个波斯国的信使,这个信使 没有任何情报,只有一条有着杂乱无章的希腊字母的普通腰带,最终斯巴达统帅破解了这条腰带,成功击败了希腊。这就是世界上最早的密码。同时也是世界上最早的解密。

密码在我们生活中无处不在,作为个人隐私的最后一道防线显得无比的重要,现在世界有各种各样形形色色的密码,解密方式也是层出不穷,加密,解密的过程里充满了数学以及计算机的知识,而现在手机的加密的方式也有很多、数字、手势、指纹、人脸、虹膜等等方式多种多样,有加密就有解密、有破译等等,有些App为了安全起见,例如招商银行的银行类的App在每次启动的时候都需要解验证身份,那么今天我们用Flutter实现一个其中的加密方式,手势密码。

知识点:手势识别、绘制、动画

1、绘制静态图形

手势密码一般都是九宫格的形状,所以第一步我们先把这个辅助矩形九宫格画出来,然后在每一个格子内就可以绘制我们喜欢的图形了,九宫格那就很简单了。
首先我们定义一个正方形300*300 为九宫格的区域,然后对这个正方形平均分成9个小格子,我们需要找到这9个小格子的中心点来绘制九宫格,那么我们找到之后把每个小格子的中心用一个List存储起来方便以后绘制。

代码:

double size = 300;// 正方形边长
List<Offset> centerOffset = <Offset>[];// 九宫格中心点

// 上面3个
centerOffset.add(Offset(-size / 3, -size / 3));
centerOffset.add(Offset(-size / 3 + size / 3, -size / 3));
centerOffset.add(Offset(-size / 3 + size / 3 * 2, -size / 3));

// 中间3个
centerOffset.add(Offset(-size / 3, 0));
centerOffset.add(Offset(-size / 3 + size / 3, 0));
centerOffset.add(Offset(-size / 3 + size / 3 * 2, 0));

// 下面3个
centerOffset.add(Offset(-size / 3, size / 3));
centerOffset.add(Offset(-size / 3 + size / 3, size / 3));
centerOffset.add(Offset(-size / 3 + size / 3 * 2, size / 3));

接下来我们就可以用这些点绘制九宫格了。

核心代码:

Paint paint = Paint()
  ..style = PaintingStyle.stroke
  ..strokeWidth = 2
  ..color = Colors.black87;

canvas.drawRect(
    Rect.fromCenter(center: Offset.zero, width: 300, height: 300), paint);

// 绘制辅助区域
_drawHelpRect(canvas, size, paint);
void _drawHelpRect(Canvas canvas, Size size, Paint paint) {
  for (int i = 0; i < centerOffset.length; i++) {
    canvas.drawRect(
        Rect.fromCenter(center: centerOffset[i], width: 100, height: 100),
        paint);
  }
}

效果图:

得到九宫格之后,我们看到很多手势解锁小格子内都是圆形,这里我们继续在每个小格子绘制圆形图案,

核心代码:

// 绘制圆
_drawCirCle(canvas, size, paint);
void _drawCirCle(Canvas canvas, Size size, Paint paint) {
 for (int i = 0; i < centerOffset.length; i++) {
   canvas.drawCircle(centerOffset[i], 30, paint..color = Colors.black87);
 }
}

效果图:

到这里基本图形已经绘制完了。

2、存储手势密码数据

首先我们看下手势解锁一共有按下、移动、抬起三个动作组成,在移动的过程中会经过九宫格内部的圆形区域,也就是说,在经过圆形区域的时候,我们需要将这个数据保存下来然后通知画布进行更新,这里的逻辑跟我之前一篇绘制海豚那篇原理一样,首先创建UnlockController类继承ChangeNotifier。这里我们将九宫格中的每一个小格子对应一个数字进行封装一下。也是之后的设置和解锁需要保存的数据。 这样的话我们上面的九宫格就需要修改一下了,将Offset改为PassWord就行。

数据代码:

class UnlockController extends ChangeNotifier {
  // 存储按压的点集合
  List<PassWord> _points = [];

  List<PassWord> get points => _points;

  // 当前手指的位置
  Offset? _currentOffset;

  Offset? get currentOffset => _currentOffset;

  //
  set currentOffset(Offset? value) {
    _currentOffset = value;
    notifyListeners();
  }

  addPoint(PassWord offset) {
    _points.add(offset);
    notifyListeners();
  }

  // 清除所有点
  clearAllPoint() {
    _points.clear();
    notifyListeners();
  }
}

class PassWord {
  int num; // 密码数字
  Offset offset; // 密码数字对应的点
  PassWord(this.num, this.offset);
}

有了这些数据之后我们接下来就要跟手势进行交互了。

3、添加手势交互

接着上面刚说的,交互一共有三种状态,按下、移动、抬起,那么我们就先对这三种状态进行监听,

GestureDetector(
  child: CustomPaint(
    size: Size(size, size),
    painter:
        _GesturesUnlockPainter(_unlockController, centerOffset),
  ),
  onPanDown: (d) {
    // 手指按下
},
  onPanUpdate: (d) {
    // 移动                
  },
  onPanEnd: (d) {
   // 抬起结束
  },
)

交互思路: 手势密码的特点是每个九宫格只允许点亮一次,再次经过不保存数据。

按下: 判断是否在九宫格内部任一圆形区域内,在:点亮圆形,保存数据,不在:不做任何操作,

移动: 判断是否移动到九宫格任一圆形区域内,在:判断是否已点亮-未点亮:点亮圆形,保存数据,已点亮:不做任何操作,不在区域内,也不做数据任何操作。

抬起: 获取密码,进行设置或验证。

大概思路还是比较清晰的,下面我们就对这些判断条件进行判断。

代码:

///手指按下、移动触发
void judgeZone(Offset src) {
  /// 循环所有的九宫格
  for (int i = 0; i < centerOffset.length; i++) {
    var srcTranslate = src.translate(-size / 2, -size / 2);
    // 判断手指按的位置是否在九宫格圆形区域
    if (judgeCircleArea(srcTranslate, centerOffset[i].offset, 30)) {
      // 在 判断是否已添加
      for (int j = 0; j < _unlockController.points.length; j++) {
        if (_unlockController.points[j] == centerOffset[i]) {
          // 已添加过 返回
          return;
        }
      }
      // 未添加过 进行添加
      _unlockController.addPoint(centerOffset[i]);
      return;
    }
  }
  // 无点
}
///判断出是否在某点的半径为r圆范围内
bool judgeCircleArea(Offset src, Offset dst, double r)=>(src - dst).distance <= r;

有了手指数据之后,我们就能根据这些数据的变化进而通知画布进行更新了。

4、绘制、刷新密码线

上面我们已经拿到数据了,接下来我们进行绘制密码线,如何刷新画布之前的文章我已经讲过很多遍了,这里不熟悉的同学可以看下之前绘制小海豚那一篇文章贝塞尔曲线绘制一个小海豚,回归正题,既然我们拿到了手指经过的九宫格的中心点,那绘制线就变得非常容易了,

核心代码:

var offsets = unlockController.points.map((e) => e.offset).toList();
// 绘制按压点
canvas.drawPoints(
    PointMode.points,
    offsets,
    paint
      ..strokeWidth = 20
      ..strokeCap = StrokeCap.round
      ..color = Colors.red);
// 绘制密码
Path path = Path();
if (unlockController.points.isNotEmpty) {
  path.moveTo(unlockController.points[0].offset.dx,
      unlockController.points[0].offset.dy);
  if (unlockController.currentOffset != null) {
  // 绘制当前手势线 未经过九宫格圆形时
    canvas.drawLine(unlockController.points.last.offset,
        unlockController.currentOffset!, paint..strokeWidth = 2);
  }
}
for (int i = 1; i < unlockController.points.length; i++) {
  path.lineTo(unlockController.points[i].offset.dx,
      unlockController.points[i].offset.dy);
}
canvas.drawPath(path, paint..strokeWidth = 2);

这样我们就把手势经过的密码线绘制出来了。

效果图:

5、加入密码错误动画

当我们输入密码错误时,给用户一个提示密码错误的交互也是很有必要的,那么接下来我们就添加一个简单文字抖动效果提示用户密码输入错误。
添加动画也很简单,思路: 不断改变文字的边距从而达到抖动效果。

核心代码:

late AnimationController _animationController =
    AnimationController(vsync: this, duration: Duration(milliseconds: 500));

late CurvedAnimation curvedAnimation =
    CurvedAnimation(curve: Curves.easeIn, parent: _animationController);
late Animation<double> animation =
    Tween(begin: 0.0, end: 10.0).animate(curvedAnimation)
      ..addStatusListener((status) {
        if (status == AnimationStatus.completed) {
          _animationController.reset();
        }
      });
AnimatedBuilder(
    animation: animation,
    builder: (ctx, child) {
      return Container(
        margin: EdgeInsetsDirectional.only(
            bottom: 20,
            start: _errorPwd() * 20,
            end: animation.value),
        child: Text(
          text,
          style: TextStyle(fontSize: 20, color: textColor),
        ),
      );
    }),
    
double _errorPwd() {
  double x = animation.value; // 变化速度 0-10,
  double d = x - x.truncate(); // 获取这个数字的小数部分
  double? y;
  if (d <= 0.5) {
    y = 2 * d;
  } else {
    y = 1 - 2 * (d - 0.5);
  }
  return y;
}

假设我们设置的密码是14789,也就是L型,看下最终效果:

完整源码之后我会放到GitHub上。

总结

通过手势识别我们用到了App中核心的三大框架,手势、绘制、以及动画中的知识。其实原理也并不复杂,只要掌握了这三大框架的核心基础知识

到此这篇关于基于Flutter实现手势密码加密与解锁功能的文章就介绍到这了,更多相关Flutter手势密码加密解锁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于Flutter实现手势密码加密与解锁功能

本文链接: https://www.lsjlt.com/news/147578.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于Flutter实现手势密码加密与解锁功能
    目录前言1、绘制静态图形2、存储手势密码数据3、添加手势交互4、绘制、刷新密码线5、加入密码错误动画总结前言 密码的由来:在公元前405年,由古希腊和斯巴达的战争中,由于斯巴达盟友波...
    99+
    2022-11-13
  • python基于crypto实现加密与解密
    1.安装crypto库 pip install pycryptodome ps: 使用pip工具安装步骤: 1、直接安装pycryptodome模块即可 pip install pycryptodom...
    99+
    2023-10-10
    python 开发语言
  • vue2实现手势密码功能
    本文实例为大家分享了vue2实现手势密码功能的具体代码,供大家参考,具体内容如下 组件: <template>   <div class="masks" v-sho...
    99+
    2022-11-13
  • Android仿支付宝手势密码解锁功能
    Starting 创建手势密码可以查看 CreateGestureActivity.java 文件. 登陆验证手势密码可以看 GestureLoginActivity.jav...
    99+
    2022-06-06
    解锁 支付宝 手势 Android
  • Android实现支付宝手势密码功能
    今天就给大家分享android实现支付宝手势密码,很常见,像现在用微信支付,支付宝支付的时候都要自己设置的4位PIN码,然后输入PIN码后立即调用支付接口去支付,毫无疑问的安全...
    99+
    2022-06-06
    支付宝 手势 Android
  • jQuery如何实现手势解锁密码特效
    这篇文章主要为大家展示了“jQuery如何实现手势解锁密码特效”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jQuery如何实现手势解锁密码特效”这篇文章吧。效...
    99+
    2022-10-19
  • vue基于input实现密码的显示与隐藏功能
    前言 大家都知道,一般情况下,输入框的密码我们是看不到密码的,只有当我们点击查看密码的小图标时,密码才会显现出来,实现起来也非常简单,通过点击图标让input的type属性变化即可。...
    99+
    2022-11-12
  • 如何实现Oracle11g用户修改密码及加锁解锁功能
    小编给大家分享一下如何实现Oracle11g用户修改密码及加锁解锁功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.运行 c...
    99+
    2022-10-18
  • vue基于input如何实现密码的显示与隐藏功能
    vue基于input如何实现密码的显示与隐藏功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言大家都知道,一般情况下,输入框的密码我们是看不到密码的,只有当...
    99+
    2023-06-26
  • Android开发中怎么实现一个手势密码功能
    本篇文章为大家展示了Android开发中怎么实现一个手势密码功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果使用GestureOverlayView,在xml配置文件中使用Android.ge...
    99+
    2023-05-31
    android roi
  • 如何在Android应用中实现一个手势密码功能
    如何在Android应用中实现一个手势密码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现思路: 正上方的提示区域,用一个类(LockIndicator....
    99+
    2023-05-31
    android roi
  • 如何在Android中利用view实现一个手势密码功能
    这篇文章将为大家详细讲解有关如何在Android中利用view实现一个手势密码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。用法: <com.leo.library.view.Ge...
    99+
    2023-05-31
    android roi view
  • Spring Security基于散列加密方案实现自动登录功能
    目录前言一. 自动登录简介1. 为什么要自动登录2. 自动登录的实现方案二. 基于散列加密方案实现自动登录1. 配置加密令牌的key2. 配置SecurityConfig类3. 添加...
    99+
    2022-11-12
  • Android开发中中怎么实现投放九宫格手势密码功能
    这篇文章将为大家详细讲解有关Android开发中中怎么实现投放九宫格手势密码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。要实现九宫格密码要解决的问题有:给九宫格密码界面布局九个点,即确...
    99+
    2023-05-31
    android roi
  • 通过T-SQL语句创建游标与实现数据库加解密功能
    通过动态SQL语句创建游标 DECLARE @sql varchar(100); DECLARE @TableName varchar(32); DECLARE ...
    99+
    2022-11-13
  • Springboot实现邮箱验证码注册与修改密码及登录功能详解流程
    目录前言一、SpringBoot依赖1、pom.xml文件2、Applications.yaml二、数据库文件三、实现注册功能四、找回密码功能五、登录功能总结前言 最近Springb...
    99+
    2022-11-16
    Springboot邮箱验证码 Springboot修改密码 Springboot登陆功能
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作