Flutter实现滑动块验证码功能

 更新时间:2022年03月23日 17:08:31   作者:yuan1809  
这篇文章主要为大家详细介绍了Flutter实现滑动块验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Flutter实现滑动块验证码功能,供大家参考,具体内容如下

本文实现的是一个用于登录时,向右滑动滑动块到最右边完成验证的一个功能。当滑动未到最右边时,滑动块回弹回左边起始位置。

import 'package:flutter/material.dart';
 
class SlideVerifyWidget extends StatefulWidget{
 
  /// 背景色
  final Color backgroundColor;
  /// 滑动过的颜色
  final Color slideColor;
  /// 边框颜色
  final Color borderColor;
 
  final double height;
  final double width;
 
  final VoidCallback verifySuccessListener;
 
  const SlideVerifyWidget({
    Key key,
    this.backgroundColor = Colors.blueGrey,
    this.slideColor = Colors.green,
    this.borderColor = Colors.grey,
    this.height = 44,
    this.width = 240,
    this.verifySuccessListener
  }) : super(key: key);
 
  @override
  State<StatefulWidget> createState() {
    return SlideVerifyState();
  }
 
}
 
class SlideVerifyState extends State<SlideVerifyWidget> with TickerProviderStateMixin{
 
  double height;
  double width ;
 
  double sliderDistance = 0;
 
  double initial = 0.0;
 
  /// 滑动块宽度
  double sliderWidth = 64;
 
  /// 验证是否通过,滑动到最右方为通过
  bool verifySuccess = false;
 
  /// 是否允许拖动
  bool enableSlide = true;
 
  AnimationController _animationController;
  Animation _curve;
 
  @override
  void initState() {
    super.initState();
    this.width = widget.width;
    this.height = widget.height;
    _initAnimation();
  }
 
  @override
  void dispose() {
    _animationController?.dispose();
    super.dispose();
  }
 
 
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onHorizontalDragStart: (DragStartDetails details){
        if(!enableSlide){
          return;
        }
        initial = details.globalPosition.dx;
      },
      onHorizontalDragUpdate: (DragUpdateDetails details){
        if(!enableSlide){
          return;
        }
        sliderDistance = details.globalPosition.dx - initial;
        if(sliderDistance < 0){
          sliderDistance = 0;
        }
        /// 当滑动到最右边时,通知验证成功,并禁止滑动
        if(sliderDistance > width - sliderWidth){
          sliderDistance = width - sliderWidth;
          enableSlide = false;
          verifySuccess = true;
          if(widget.verifySuccessListener != null){
            widget.verifySuccessListener();
          }
        }
        setState(() {
        });
      },
      onHorizontalDragEnd: (DragEndDetails details){
        /// 滑动松开时,如果未达到最右边,启动回弹动画
        if(enableSlide){
          enableSlide = false;
          _animationController.forward();
        }
      },
      child: Container(
        height: height,
        width: width,
        decoration: BoxDecoration(
          color: widget.backgroundColor,
          border: Border.all(color: widget.borderColor),
            /// 圆角实现
          borderRadius: BorderRadius.all(new Radius.circular(height))
        ),
        child: Stack(
          children: <Widget>[
            Positioned(
              top: 0,
              left: 0,
              child: Container(
                height: height - 2,
                /// 当slider滑动到距左边只有两三像素距离时,已滑动背景会有一点点渲染出边框范围,
                /// 因此当滑动距离小于1时,直接将宽度设置为0,解决滑动块返回左边时导致的绿色闪动,但如果是缓慢滑动到左边该问题仍没解决
                width: sliderDistance < 1? 0 : sliderDistance + sliderWidth / 2,
                decoration: BoxDecoration(
                    color: widget.slideColor,
                    /// 圆角实现
                    borderRadius: BorderRadius.all(new Radius.circular(height / 2))
                ),
              ),
            ),
            Center(
              child: Text(verifySuccess?"验证成功":"请按住滑块,拖动到最右边", style: TextStyle(color: verifySuccess?Colors.white:Colors.black54, fontSize: 14),),
            ),
            Positioned(
              top: 0,
              /// 此处将sliderDistance距离往左偏2是解决当滑动块滑动到最右边时遮挡外部边框
              left: sliderDistance > sliderWidth ? sliderDistance - 2 : sliderDistance,
              child: Container(
                width: sliderWidth,
                height: height - 2 ,
                alignment: Alignment.center,
                decoration: BoxDecoration(
                    color: Colors.white,
                    border: Border.all(color: widget.borderColor),
                    /// 圆角实现
                    borderRadius: BorderRadius.all(new Radius.circular(height))
                ),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    SizedBox(width: 6,),
                    Image.asset("assets/images/ic_safety.png", height: 24, width: 24,),
                    Image.asset("assets/images/ic_next_primary.png", height: 16, width: 16,),
                    /// 因为向右箭头有透明边距导致两个箭头间隔过大,因此将第二个箭头向左偏移,如果切图无边距则不用偏移
                    Transform(
                      transform: Matrix4.translationValues(-8, 0, 0),
                      child: Image.asset("assets/images/ic_next_primary.png", height: 16, width: 16,),
                    ),
                  ],
                ),
              ),
            )
          ],
        ),
      ),
    );
  }
 
  /// 回弹动画
  void _initAnimation(){
    _animationController = AnimationController(
        duration: const Duration(milliseconds: 300), vsync: this);
    _curve = CurvedAnimation(parent: _animationController, curve: Curves.easeOut);
    _curve.addListener(() {
      setState(() {
        sliderDistance = sliderDistance - sliderDistance * _curve.value;
        if(sliderDistance <= 0){
          sliderDistance = 0;
        }
      });
    });
    _animationController.addStatusListener((status) {
      if(status == AnimationStatus.completed){
        enableSlide = true;
        _animationController.reset();
      }
    });
  }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android仿微信通话背景的高斯模糊效果

    Android仿微信通话背景的高斯模糊效果

    目前的应用市场上,使用毛玻璃效果的APP随处可见,比如用过微信语音聊天的人可以发现,语音聊天页面就使用了高斯模糊效果。本文就使用Android仿写一个这样的效果
    2021-06-06
  • Android自定义View之组合控件实现类似电商app顶部栏

    Android自定义View之组合控件实现类似电商app顶部栏

    这篇文章主要为大家详细介绍了Android自定义View之组合控件,实现类似电商app顶部栏的相关资料,具有参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 解析Android截取手机屏幕两种实现方案

    解析Android截取手机屏幕两种实现方案

    这篇文章主要介绍了解析Android截取手机屏幕两种实现方案,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • 使用PHP开发Android应用程序技术介绍

    使用PHP开发Android应用程序技术介绍

    这篇文章主要介绍了使用PHP开发Android应用程序技术介绍,本文讲解了安装PHP for Android、设置PHP for Android开发环境、使用PHP构建Android应用程序,需要的朋友可以参考下
    2015-03-03
  • SDL2和OpenGL使用踩坑笔记经验分享

    SDL2和OpenGL使用踩坑笔记经验分享

    今天小编就为大家分享一篇关于SDL2和OpenGL使用踩坑笔记经验分享,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Flutter图片缓存管理ImageCache原理分析

    Flutter图片缓存管理ImageCache原理分析

    这篇文章主要为大家介绍了Flutter图片缓存管理ImageCache原理分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android优质索尼滚动相册

    Android优质索尼滚动相册

    这篇文章主要介绍了Android优质索尼滚动相册,桌面小部件滚动相册,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android布局控件DrawerLayout实现完美侧滑效果

    Android布局控件DrawerLayout实现完美侧滑效果

    这篇文章主要为大家详细介绍了Android布局控件DrawerLayout实现完美侧滑效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android编程获取全局Context的方法

    Android编程获取全局Context的方法

    这篇文章主要介绍了Android编程获取全局Context的方法,实例分析了基于Application类获取全局Context的实现步骤与相关技巧,需要的朋友可以参考下
    2016-01-01
  • Android中创建多线程管理器实例

    Android中创建多线程管理器实例

    这篇文章主要介绍了Android中创建多线程管理器实例,着重讲解需要做的哪些事情,每一步都配有代码例子,需要的朋友可以参考下
    2014-06-06

最新评论