Flutter-仿淘宝京东录音识别图标效果

news2025/5/24 19:22:36
效果

custom.gif

需求
  • 弹起键盘,录制按钮紧挨着输入框
  • 收起键盘,录制按钮回到初始位置
实现
  • 第一步:监听键盘弹起并获取键盘高度
  • 第二步:根据键盘高度,录制按钮高度计算偏移高度,并动画移动
  • 第三步:键盘收起,录制按钮回到原始位置
涉及知识点
  • WidgetsBindingObserver
  • didChangeMetrics()
  • MediaQuery.of(context).viewInsets.bottom
  • AnimatedPositioned
代码
import 'package:flutter/material.dart';
import 'package:flutter_xy/widgets/xy_app_bar.dart';

import '../../r.dart';

class RecordPage extends StatefulWidget {
  const RecordPage({super.key});

  @override
  State<RecordPage> createState() => _RecordPageState();
}

class _RecordPageState extends State<RecordPage> with WidgetsBindingObserver {
  //键盘的高度
  double _keyboardHeight = 0;

  final GlobalKey _key = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: XYAppBar(
        title: "搜索音频识别",
        onBack: () {
          Navigator.pop(context);
        },
      ),
      body: Stack(
        children: [
          const Positioned(
            top: 0,
            left: 0,
            right: 0,
            child: TextField(
              decoration: InputDecoration(labelText: "请输入内容"),
            ),
          ),
          AnimatedPositioned(
            duration: const Duration(milliseconds: 800),
            curve: Curves.easeInOut,
            bottom: _offsetHeight <= 0 ? 0 : _offsetHeight,
            left: 0,
            right: 0,
            child: Image.asset(
              R.record_png,
              key: _key,
              width: 50,
              height: 50,
            ),
          ),
        ],
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  @override
  void didChangeMetrics() {
    WidgetsBinding.instance.addPostFrameCallback((_) {
      if (mounted) {
        setState(() {
          //键盘高度
          _keyboardHeight = MediaQuery.of(context).viewInsets.bottom;
        });
      }
    });
  }

  /// 录制图标偏移的高度
  double get _offsetHeight {
    if (_keyboardHeight == 0) return 0;
    final screenHeight = MediaQuery.of(context).size.height;
    final inputBox = _key.currentContext?.findRenderObject() as RenderBox?;
    final offset = inputBox?.localToGlobal(Offset.zero);
    final inputPosition = offset?.dy ?? 0;
    final inputHeight = inputBox?.size.height ?? 0;
    var offsetHeight =
        (inputPosition + inputHeight) - (screenHeight - _keyboardHeight);
    return offsetHeight;
  }
}

详情见:github.com/yixiaolunhui/flutter_xy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1528503.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习_卷积

卷积 卷积&#xff08;Convolution&#xff09;是数学和计算机科学中的一个重要概念&#xff0c;特别在信号处理和图像处理中应用广泛。在信号处理领域&#xff0c;卷积是两个函数之间的一种数学操作&#xff0c;它表示两个函数的重叠部分的积分量。 在图像处理中&#xff0c…

KKVIEW远程: TODESK退出了还能远程吗

Todesk退出了还能远程吗 当我们谈论Todesk或其他远程桌面软件时&#xff0c;一个经常被提及的问题是&#xff1a;当我退出Todesk后&#xff0c;是否仍然可以远程访问我的计算机&#xff1f;为了回答这个问题&#xff0c;我们首先需要了解Todesk的工作原理和远程访问的基本条件…

WhatsApp商业推广有哪些推广技巧?

在现代化商业&#xff0c;与用户创造紧密、良好的互动体验&#xff0c;建立强大的品牌形象以及找到最佳的推广途径&#xff0c;变得尤为重要。而WhatsApp作为全球使用最广泛的即时通讯应用之一&#xff0c;成为无数企业选择优选的推广平台。那么&#xff0c;在WhatsApp商业推广…

图书推荐|西门子S7-1200 PLC编程与应用实例

一线资深工程师的全彩版PLC实战教程&#xff0c;软硬件及编程全方位详解&#xff08;配视频教学&#xff09; 本书内容 《西门子S7-1200 PLC编程与应用实例》对西门子S7-1200 PLC的硬件和编程软件的功能进行详细讲解&#xff0c;内容包括PLC编程基础、博途TIA软件入门、指令介…

使用OCC进行切割操作

OCC中切割操作以一个平面作为切割面&#xff0c;对物体进行切割操作 //要操作的图形 TopoDS_Shape shape getHanleShape(); //构造切割面 TopoDS_Shape faceShape getSplitterFace(); //切割操作 BOPAlgo_Splitter splitter; splitter.AddArgument(shape); splitter.AddTool(…

13.Python从入门到精通—Python 集合操作与方法概览

13.Python从入门到精通—Python 集合操作与方法概览 Python 集合集合的基本操作1、添加元素2、移除元素3、计算集合元素个数4、清空集合5、判断元素是否在集合中存在 集合内置方法完整列表 Python 集合 在Python中&#xff0c;集合是一种无序、不重复的数据类型。集合通常用于…

unicloud快速上手,unicloud项目创建以及项目创建注意事项

uniCloud快速上手 本项目地址https://gitee.com/qayrup/unicloud-demo 创建unicloud项目 新建一个uni项目,并选择启用unicloud,选择阿里云或腾讯云 阿里云和支付宝云都支持一个月免费的云,如果只想体验啥的,可以选择这两个, 但是需要注意,支付宝云需要配置跨域,否则很多云函…

0基础学习VR全景平台篇第145篇:图层控件功能

大家好&#xff0c;欢迎观看蛙色VR官方——后台使用系列课程&#xff01;这期&#xff0c;我们将为大家介绍如何使用图层控件功能。 一.如何使用图层控件功能&#xff1f; 进入作品编辑页面&#xff0c;点击左边的控件后就可以在右边进行相应设置。 二.图层控件有哪些功能&am…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

英语广场杂志英语广场杂志社英语广场编辑部2024年第3期目录

英语翻译理论与实践 浅析钱钟书“化境论”与文言文英译的适配度 冯睿;姚锦宁;李佳彧; 3-6《英语广场》投稿&#xff1a;cn7kantougao163.com 目的论视角下《写作、阅读和演讲的艺术》的翻译分析报告 张俊怡; 7-10 新加坡籍译者温宏文翻译行为研究 周梦; 11-14 …

CVE-2024-24112 XMall后台管理系统 SQL 注入漏洞分析

------作者本科毕业设计项目 基于 Spring Boot Vue 开发而成...... [Affected Component] /item/list /item/listSearch /sys/log /order/list /member/list (need time-based blind injection) /member/list/remove 项目下载地址 Exrick/xmall: 基于SOA架构的分布式…

百年难遇:3款良心好用的国产软件,常被误以为是外国佬开发

许多出色的国产软件&#xff0c;但由于某些特殊原因&#xff0c;我们常常错过了它们。 今天&#xff0c;笔者将向大家推荐三款电脑必备的软件&#xff0c;每一款都堪称神器。 Teamind Teamind是一款功能强大的在线白板工具&#xff0c;支持多人协作&#xff0c;成为众多居家…

收银软件多少钱一套?亿发全面解析超市收银系统软件价位

当超市经营达到一定规模时&#xff0c;商户通常会选择配置收银系统软件&#xff0c;以提升收银效率和为顾客提供更完善的购物体验。然而&#xff0c;人们常问&#xff1a;收银系统软件一套需要多少钱&#xff1f;安装一个收银系统又需要多少费用呢&#xff1f;了解收银系统软件…

JDK1.8安装环境变量配置检测是否安装成功

前言 目前市面上最常用的还是java1.8和Mysql5.7&#xff08;企业&#xff09;2024 安装包 已上传CSDN&#xff0c;审核中 JDK安装细节 注&#xff1a;如果怕麻烦就直接安装在C盘&#xff08;默认&#xff09; 环境变量配置 Win10打开左下角图标点击系统&#xff0c;下滑点…

ET框架新起一个服务及实现服务之间的消息通讯

ET框架是熊猫大大写的双端框架&#xff0c;游戏客户端和服务端都是用C#语言来编写 新起一个服务名比如叫做Activity 1.配置文件StartSceneConfig 2. SceneFactory switch (scene.SceneType) {case SceneType.Activity:break; } 定义SceneType枚举类型 public enum SceneTyp…

计算机网络——物理层(物理传输介质和物理层的设备)

计算机网络——物理层&#xff08;物理传输介质和物理层的设备 物理传输介质导向性传输介质双绞线同轴电缆光纤 非导向性传输介质无线电波多径效应 微波地面微波通信ISM 频段 卫星通信 物理层设备中继器集线器中继器和集线器的区别 我们今天进入物理层的物理传输介质和物理层的…

【原创】手动安装open-webui,非官方docker安装方法,可汉化ui

open-webui是一个为LLMs&#xff08;大型语言模型&#xff09;设计的友好型Web用户界面&#xff0c;支持Ollama和OpenAI兼容的API。它提供了直观的聊天界面、响应式设计、快速响应性能、简易安装、代码语法高亮、Markdown和LaTeX支持、本地RAG集成、Web浏览能力、提示预设支持、…

Vue 中使用事件总线来进行组件间通信($emit()、$on() 和 $off())

使用场景&#xff1a; 上一篇文章中写到的&#xff1a; echarts图表左击显示自定义弹框&#xff0c;右击取消自定义弹框 结构图&#xff1a;&#xff08;removet修改为remove&#xff09; 假设这个echarts图表是子组件B页面中。而父页面A的自定义弹框标签里调用了子组件B&am…

如何使用生成式AI来制定SEO内容策略?

SEO内容策略是一系列旨在优化网站内容以提高其在搜索引擎中排名的行动计划&#xff0c;从而增加网站流量并提升品牌影响力。在当今互联网信息海量的情况下&#xff0c;优秀的SEO内容策略可以帮助您的网站脱颖而出&#xff0c;吸引更多目标用户。 背景知识 SEO&#xff08;搜索…

基于Java中的SSM框架实现任务发布接收系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现任务发布接收系统演示 摘要 在如今的互联网发展的时代&#xff0c;互联网成了时代的主角&#xff0c;是这个时代的超级呈现家。在互联网的大家族中&#xff0c;任务发布永远是一个关键点。因为我们所有人离不开任务的发布与任务的管理&#xff0c;因为…