Flutter 手势指纹解锁

背景

  在最近做的一个Flutter项目中,需要用到手势、指纹解锁,这种需求在原生应用中非常常见,但Flutter中手势密码解锁现有库比较少、官方也仅提供有一个 local_auth指纹库,所以就自己写了个手势库。

功能属性

  • 支持自定义各状态下(常态、操作时、操作出错时、不可用时)线颜色、填充色和线宽;
  • 支持自定义各种状态下(常态、操作时、操作出错时、不可用时)每个圆圈样式和连接线样式;
  • 支持实心、空心两种样式
  • 支持图案绘制完成后延迟 500毫秒(默认值)自动清除;
  • 支持指示器辅助控件可选择使用;
  • 业务逻辑(至少连点几个点、验证时最多可出错几次等)可自定义。

实现效果

image

思路

  其实实现这个自定义的手势控件有很多思路,首先想到的是,要在View中创建9个圆,那么使用GridView再合适不过了,但是经过尝试,放弃了,这会使交互跟逻辑变的更加复杂,所以还是选择直接继承Widget,自己处理逻辑与手势,那么下面就是需要处理的逻辑:

  1. 根据控件的大小,绘制9个圆圈;
  2. 在手指按到圆圈时,开始绘制路线,并且将按下的圆圈置为选中状态;
  3. 在手指滑动时,绘制一根跟随手指移动的、起点为按下的圆圈的线;
  4. 当手指滑动到另外一个圆圈时,将第一个按下的圆圈与当前圆圈用线连起来,并且绘制一根以当前圆圈为起点的跟随手指移动的线;
  5. 手指按下到圆圈时,以及每次划过圆圈时,将此圆圈对应的数字添加到数组;
  6. 当手指抬起时,根据添加的数字判断密码是否正确,若错误,则将所有的线、选中的圆,都置为错误的状态、颜色;
  7. 当超过错误次数不可用时,将圆设为不可用状态、颜色,且不可滑动;

代码结构

类名 描述
GestureUnlockView 手势绘制区域、包括9个圆圈、手势操作、自定义属性等
UnlockPointPainter 圆圈绘制类
UnlockPoint 圆圈属性类
UnlockLinePainter 连接线绘制类
GestureUnlockIndicator 辅助指示器类

支持属性

属性名 作用 默认值
size 整个控件大小
type 圆圈类型 实心
padding 与父 widget 边距 10
roundSpace 圆圈之间的间距
roundSpaceRatio 圆圈之间的间距比例(以圆半径作为基准),[roundSpace]设置时无效 0.6
defaultColor 常态时颜色 Colors.grey
selectedColor 操作时选中颜色 Colors.blue
failedColor 操作出错时颜色 Colors.blue
disableColor 不可用时颜色 Colors.grey
lineWidth 连接线宽度 2
solidRadiusRatio 实心圆半径比例(以圆半径作为基准) 0.4
touchRadiusRatio 触摸有效区半径比例(以圆半径作为基准) 0.6
delayTime 延迟还原显示时间 500ms
onCompleted 手势绘制完成回调

使用示例

Step1:在项目pubspec.yaml添加依赖

dependencies:
    flutter_gesture_unlock: ^1.0.6

Step2 初始化控件

GestureUnlockView(
        size: LcfarmSize.dp(331), //设置大点,让触摸区域变大。让触摸更有效。
        padding: LcfarmSize.dp(40),
        roundSpace: LcfarmSize.dp(40),
        defaultColor: LcfarmColor.colorE3E4E6,
        selectedColor: LcfarmColor.color3776E9,
        failedColor: LcfarmColor.colorFF5656,
        disableColor: LcfarmColor.color30E3E4E6,
        solidRadiusRatio: 0.3,
        lineWidth: LcfarmSize.dp(2),
        touchRadiusRatio: 0.3,
        onCompleted: _gestureComplete,
      );
      
      
 void _gestureComplete(List<int> selected, UnlockStatus status) async {
    switch (_notifier.status) {
      case GestureStatus.create:
      case GestureStatus.createFailed:
        if (selected.length < 4) {
          _notifier.setStatus(
            status: GestureStatus.createFailed,
            gestureTxt: "连接数不能小于4个,请重新设置",
          );
          _gestureUnlockView.updateStatus(UnlockStatus.failed);
        } else {
          _notifier.setStatus(
            status: GestureStatus.verify,
            gestureTxt: "请再次绘制解锁密码",
            resetGestureTxt: "点击此处以重新开始",
          );
          _gesturePassword = GestureUnlockView.selectedToString(selected);
          _gestureUnlockView.updateStatus(UnlockStatus.success);
          _indicator.setSelectPoint(selected);
        }
        break;
      case GestureStatus.verify:
      case GestureStatus.verifyFailed:
        String password = GestureUnlockView.selectedToString(selected);
        if (_gesturePassword == password) {
          showTips("手势密码设置成功");
          //保存密码
    
        } else {
          _notifier.setStatus(
            status: GestureStatus.verifyFailed,
            gestureTxt: "与上一次绘制不一致, 请重新绘制",
          );
          _gestureUnlockView.updateStatus(UnlockStatus.failed);
        }
        break;
      case GestureStatus.verifyFailedCountOverflow:
        break;
    }
  }

指纹

由于官方插件库已经提供有 local_auth 库,在这里就不大赘述,具体使用就参考Flutter官方local_auth插件库。

最后

  如果在使用过程遇到问题,欢迎下方留言交流。

  Pub 库地址

学习资料

请大家不吝点赞!因为您的点赞是对我最大的鼓励,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容