热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter仿钉钉打卡

Flutter仿钉钉打卡-Flutter仿钉钉打卡具体效果如下开发流程设置点击按钮样式,这里使用Container()设置:Container(height:

Flutter仿钉钉打卡具体效果如下

开发流程

  1. 设置点击按钮样式,这里使用Container()设置:
           Container(
                  height: 144.0,
                  width: 144.0,
                  alignment: Alignment.center,
                  padding: EdgeInsets.only(top: 40.0),
                  decoration: BoxDecoration(
                      shape: BoxShape.circle,
                      ...
                   ),
                  child: Column(
                    children: [
                    ...
                    ],
                  ),
                )
  1. 添加文案,文案包含“打卡”和当前时间(HH:mm:ss),在1中Column的children添加相关文案:
                  child: Column(
                    children: [
                      Text(
                        "打卡",
                        style: TextStyle(
                          fontSize: 32.0,
                          color: Colors.white,
                        ),
                      ),
                      SizedBox(
                        height: 4.0,
                      ),
                      Text(
                        time,
                        style: TextStyle(fontSize: 24.0, color: Colors.white),
                      ),
                    ],
                  ),
  1. 设置渐变色背景,正常状态下背景为蓝色,异常状态下背景为橙色,在1中Container的BoxDecoration中添加gradient:
                   gradient: LinearGradient(
                          begin: Alignment.topCenter,
                          end: Alignment.bottomCenter,
                          // 1为正常状态否则为异常状态
                          colors: type == 1
                              ? [
                                  Color(0xFF1DE0FA),
                                  Color(0xFF1376EE),
                                ]
                              : [
                                  Color(0xFFFFB164),
                                  Color(0xFFED6230),
                                ]),
  1. 设置阴影,同样在在1中Container的BoxDecoration中添加boxShadow:
                 boxShadow: [
                        BoxShadow(
                            // 阴影偏移
                            offset: Offset(0, 40.0),
                             // 1为正常状态否则为异常状态
                            color: type == 1
                                ? Color(0xFF1376EE)
                                : Color(0xFFED6230),
                            // 投影模糊程度
                            blurRadius: 36.0,
                            // 投影扩散程度,大于0时向外扩散,小于0时呈内聚
                            spreadRadius: -36.0),
                      ]),
  1. 设置雷达扫描样式:
class RadarPainter extends CustomPainter {
  final double angle;
  Paint _paint = Paint()..style = PaintingStyle.fill;

  RadarPainter(this.angle);

  @override
  void paint(Canvas canvas, Size size) {
    var radius = min(size.width / 2, size.height / 2);
    // 设置扫描线样式,白色,透明度从0.01过渡到0.5,角度为pi/9=20°
    _paint.shader = ui.Gradient.sweep(
        Offset(size.width / 2, size.height / 2),
        [
          Colors.white.withOpacity(0.01),
          Colors.white.withOpacity(0.1),
          Colors.white.withOpacity(0.2),
          Colors.white.withOpacity(0.3),
          Colors.white.withOpacity(0.4),
          Colors.white.withOpacity(0.5)
        ],
        [0.0, 0.2, 0.4, 0.6, 0.8, 1.0],
        TileMode.clamp,
        .0,
        pi / 9);

    canvas.save();
    // 扫过的角度绘制计算
    double r = sqrt(pow(size.width, 2) + pow(size.height, 2));
    double startAngle = atan(size.height / size.width);
    Point p0 = Point(r * cos(startAngle), r * sin(startAngle));
    Point px = Point(r * cos(angle + startAngle), r * sin(angle + startAngle));
    canvas.translate((p0.x - px.x) / 2, (p0.y - px.y) / 2);
    canvas.rotate(angle);

    canvas.drawArc(
        Rect.fromCircle(
            center: Offset(size.width / 2, size.height / 2), radius: radius),
        0,
        pi / 9,
        true,
        _paint);
    canvas.restore();
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}
  1. 雷达扫描属于动画,点击按钮时显示动画,打卡成功后隐藏动画,设置相关动画:
		// 动画控制器初始化
   		 radarCOntroller= AnimationController(duration: const Duration(seconds: 1), vsync: this);
   		 radarController.addStatusListener((status) {
     		 if (status == AnimationStatus.completed) {
       			 isShowRadar = false;
     			}
   		 	});
   		 animation = Tween(begin: .0, end: pi * 2).animate(radarController);
         ...
              Visibility(
                    visible: isShowRadar,
                    child: AnimatedBuilder(
                        animation: animation,
                        builder: (context, child) {
                          return Container(
                            height: 144.0,
                            width: 144.0,
                            child: CustomPaint(
                              painter: RadarPainter(animation.value),
                            ),
                          );
                        }),
                  ),
            	 ...
            	 // 销毁
                @override
 		 void dispose() {
                   radarController.dispose();
                  super.dispose();
                  }
  1. 组装,需要将雷达动画覆盖在画好的打卡按钮上,同时打卡按钮需要具备点击功能:
    GestureDetector(
            onTap: () => onTapSign(),
            child: Stack(
              children: [
                // 1中画好的圆圈
                Container(...),
                // 扫描雷达
                radar,
                ]
               )
            )

推荐阅读
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • Flutter中计算文本尺寸的方法
    在Flutter开发中,有时需要计算文本的宽度和高度。本文介绍了一种利用TextPainter类实现这一功能的方法。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在探讨如何在Android的TextView中实现多彩文字与多样化字体效果时,本文提供了一种不依赖HTML技术的解决方案。通过使用SpannableString和相关的Span类,开发者可以轻松地为文本添加丰富的样式和颜色,从而提升用户体验。文章详细介绍了实现过程中的关键步骤和技术细节,帮助开发者快速掌握这一技巧。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 如何使用ES6语法编写Webpack配置文件? ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
author-avatar
邱文馨4966
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有