<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
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(); } }); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45