Flutter&鸿蒙next 实现长按录音按钮及动画特效

简介: 本文介绍了如何在 Flutter 中实现一个带有动画效果的长按录音按钮。通过使用 `GestureDetector` 监听长按手势,结合 `AnimatedContainer` 和 `AnimationController` 实现按钮的动画效果,以及 `flutter_sound` 插件完成录音功能。文章详细讲解了功能需求、实现思路和代码实现,帮助读者逐步掌握这一实用功能的开发方法。

在 Flutter 中实现长按录音按钮并且添加动画特效,是一个有趣且实用的功能。本文将通过实现一个具有动画效果的长按录音按钮,带领你一步步了解如何使用 Flutter 完成这个任务,并解释每一部分的实现。

一、功能需求
我们需要一个按钮,当用户长按时,开始录音并且显示相应的录音进度。长按结束时,停止录音并显示录音的结果。同时,在长按时,按钮应该具备一个动画效果,展示录音进度或指示正在录音。

二、实现思路
按钮UI设计:使用 GestureDetector 监听长按手势,设置不同的状态(长按开始、录音中、录音结束)。
动画效果:使用 AnimatedContainer 或 AnimationController 配合 Tween 实现按钮的尺寸变化、颜色变化等动画效果,提升用户体验。
录音功能:利用 Flutter 的录音插件 flutter_sound 来实现录音功能。
三、代码实现

  1. 添加依赖
    在 pubspec.yaml 文件中添加所需的依赖:

yaml

dependencies: flutter: sdk: flutter flutter_sound: ^9.1.9 # 音频录制插件

  1. 编写UI和动画逻辑
    import 'package:flutter/material.dart';
    import 'package:flutter_sound/flutter_sound.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '长按录音按钮',
theme: ThemeData(primarySwatch: Colors.blue),
home: RecordingButton(),
);
}
}

class RecordingButton extends StatefulWidget {
@override
_RecordingButtonState createState() => _RecordingButtonState();
}

class _RecordingButtonState extends State with TickerProviderStateMixin {
FlutterSoundRecorder _recorder; // 录音器
bool _isRecording = false; // 是否正在录音
double _progress = 0.0; // 录音进度
AnimationController _animationController; // 动画控制器
Animation _scaleAnimation; // 缩放动画
Animation _colorAnimation; // 颜色变化动画

@override
void initState() {
super.initState();
_recorder = FlutterSoundRecorder();
_initRecorder();
_initAnimations();
}

// 初始化录音器
void _initRecorder() async {
await _recorder.openAudioSession();
}

// 初始化动画控制器
void _initAnimations() {
_animationController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 200),
);

_scaleAnimation = Tween<double>(begin: 1.0, end: 1.2).animate(
  CurvedAnimation(parent: _animationController, curve: Curves.easeInOut),
);

_colorAnimation = ColorTween(begin: Colors.blue, end: Colors.red).animate(
  CurvedAnimation(parent: _animationController, curve: Curves.easeInOut),
);
AI 代码解读

}

// 开始录音
void _startRecording() async {
await _recorder.startRecorder(toFile: 'audio.aac');
setState(() {
_isRecording = true;
});
_animationController.forward();
_recordingProgress();
}

// 停止录音
void _stopRecording() async {
await _recorder.stopRecorder();
setState(() {
_isRecording = false;
_progress = 0.0;
});
_animationController.reverse();
}

// 录音进度
void _recordingProgress() async {
while (_isRecording) {
await Future.delayed(Duration(milliseconds: 100));
final progress = await _recorder.getRecordingDuration();
setState(() {
_progress = progress.inSeconds.toDouble();
});
if (_progress >= 10) { // 假设录音最大为10秒
_stopRecording();
}
}
}

@override
void dispose() {
_recorder.closeAudioSession();
_animationController.dispose();
super.dispose();
}

@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('长按录音按钮')),
body: Center(
child: GestureDetector(
onLongPress: startRecording,
onLongPressEnd: (
) => _stopRecording(),
child: AnimatedBuilder(
animation: _animationController,
builder: (context, child) {
return Container(
width: 150,
height: 150,
decoration: BoxDecoration(
color: _colorAnimation.value,
shape: BoxShape.circle,
),
child: Center(
child: ScaleTransition(
scale: _scaleAnimation,
child: Icon(
_isRecording ? Icons.stop : Icons.mic,
color: Colors.white,
size: 80,
),
),
),
);
},
),
),
),
);
}
}

  1. 代码详细解释
  2. UI 和手势操作
    我们使用了 GestureDetector 来监听用户的长按手势:

onLongPress:当用户长按按钮时,调用 _startRecording 函数开始录音。
onLongPressEnd:当长按结束时,调用 _stopRecording 停止录音。
通过 AnimatedBuilder 来监听动画状态变化,更新 UI。

  1. 录音功能
    我们使用 flutter_sound 插件来处理录音功能:

_recorder.startRecorder(toFile: 'audio.aac'):开始录音并保存为 audio.aac 文件。
_recorder.stopRecorder():停止录音。
_recorder.getRecordingDuration():获取录音进度,通过 inSeconds 获取已录制的时间。

  1. 动画效果
    我们通过 AnimationController 和 Tween 来控制动画:

_scaleAnimation:通过 ScaleTransition 实现按钮的缩放
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
AI 代码解读

原文链接:https://blog.csdn.net/lbcyllqj/article/details/143580089

目录
相关文章
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
本文针对学员在“HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)”课程中提出的问题进行解答:为何无法在华为开发者社区官网找到DevEco Studio Cangjie Plugin下载链接。文中详细介绍了Cangjie Plugin的功能及获取方式,包括STS和Canary版本的申请流程,并提供了学习仓颉编程语言的资源与建议。对于普通开发者,STS版本是当前首选;同时,通过课程与官方教程,可快速掌握仓颉语言核心语法及API,助力开发HarmonyOS NEXT AI智能助手应用。
35 3
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
|
26天前
HarmonyOS NEXT - @Prop和@Link
本示例介绍了`@Prop`和`@Link`装饰器在父子组件间的数据同步机制。`@Prop`实现单向数据绑定,子组件可修改本地值,但不会同步回父组件;父组件数据更新时会覆盖子组件的本地更改。`@Link`实现双向绑定,子组件与父组件数据共享且相互影响。 **限制条件:** - `@Prop`变量深拷贝时可能丢失复杂类型。 - `@Link`不可用于`@Entry`组件,禁止本地初始化,类型需与数据源一致。 **支持类型:** - `@Prop`支持基础类型、对象、数组、`Date`及联合类型,不支持`any`。 - 数据源与`@Prop`类型需匹配,包括简单类型、数组项及对象属性。
87 41
HarmonyOS NEXT - RelationalStore关系型数据库
关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。
89 27
|
26天前
|
HarmonyOS NEXT - @Provide和@Consume
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。
81 21
HarmonyOS NEXT - Preferences用户首选项
- 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 - Preferences会将该数据缓存在内存中,当用户读取的时候,能够快速从内存中获取数据。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据。
81 19
|
26天前
HarmonyOS NEXT - @State状态变量
ArkUI 是一种声明式 UI 框架,通过状态驱动 UI 更新。@State 装饰的变量用于管理组件内部状态,具有以下特点:私有性(仅组件内访问)、必须初始化、生命周期与组件一致。它支持单向(与 @Prop)和双向(与 @Link、@ObjectLink)数据同步。状态改变时,绑定的 UI 会自动刷新。注意:@State 不支持 Function 类型,不能在 build 中修改状态变量。代码示例中展示了通过 @State 管理按钮点击计数的状态更新机制。
75 16
|
26天前
|
HarmonyOS NEXT - AlertDialog警告弹窗
`AlertDialog` 是一个用于显示警告弹窗的组件,支持自定义文本内容与回调操作。通过 `AlertDialog.show()` 方法,传入配置参数即可展示弹窗。主要功能包括设置标题、内容、按钮、模态状态、对齐方式、过渡动画等。示例代码展示了如何创建一个包含“取消”和“删除”按钮的弹窗,并在点击按钮后执行相应业务逻辑,同时更新页面消息提示。适用于需要用户确认或交互的场景。
67 14
|
17天前
|
鸿蒙NEXT如何保证应用安全:详解鸿蒙NEXT数字签名和证书机制
本文对鸿蒙NEXT公开资料进行了深入分析和解读,梳理了鸿蒙单框架应用的签名机制,拆解每一步的实操过程和背后的实现原理,并对源码分析整理签名的校验机制。从中管中窥豹,探究鸿蒙系统的安全设计思路,给从事鸿蒙研发的同学提供一些借鉴。
93 3
鸿蒙NEXT开发App相关工具类(ArkTs)
这段代码展示了一个名为鸿蒙NEXT开发 `AppUtil` 的工具类,主要用于管理鸿蒙应用的上下文、窗口、状态栏、导航栏等配置。它提供了多种功能,例如设置灰阶模式、颜色模式、字体类型、屏幕亮度、窗口属性等,并支持获取应用包信息(如版本号、包名等)。该工具类需在 UIAbility 的 `onWindowStageCreate` 方法中初始化,以便缓存全局变量。代码由鸿蒙布道师编写,适用于鸿蒙系统应用开发,帮助开发者更便捷地管理和配置应用界面及系统属性。
|
26天前
|
HarmonyOS NEXT - @CustomDialog自定义弹窗
CustomDialog 是一个用于实现自定义弹窗的工具,适用于广告、中奖提示、警告信息、软件更新等用户交互场景。通过 `CustomDialogController` 类可控制弹窗的显示与隐藏。开发者可配置多种选项,如对齐方式、偏移量、蒙层颜色、动画效果等,支持模态与非模态窗口,并可通过装饰器 `@CustomDialog` 定义弹窗界面。示例代码展示了如何创建欢迎弹窗及响应用户操作,灵活满足不同需求。
77 13