最近很火的微信啪一啪猜猜是怎样通过Flutter实现的?

2023-11-02

作者:CrazyQ1
链接:https://juejin.im/post/5eeb49a1e51d4573c91b91ab

最近这个啪一啪效果挺火的啊

群里经常有人啪;

介绍

其实之前我就双击过头像,但并没任何效果,估计是当时把这个啪一啪消息隐藏了的,最近才放出来的,刚好看到,才开始实现。

关于进度

目前只是先把具体的效果实现,估计过几天你看wechat_flutter项目的时候就有啪一啪消息体了,我的思路是新增消息体封装,或者把原有的进行修改,比如说文字消息体自定义下内容,然后显示的时候判断即可;

处理方式【本段来自Android_ZzT】

咋们尽量处理的跟微信官方客户端一模一样

暴力连续 「啪一啪」

连续一直双击头像会发现,只有第一次会发送信息,剩下的双击只会触发客户端行为「头像抖动」,是做了防爆处理的。大概过 10s 左右后恢复,可以再次触发

断网下「啪一啪」

断网情况下,双击头像,会发现,自己先能看到 「拍一拍」,然后过了一段时间后,会出现「因网络原因,对方可能不知道你拍了他」。这就证明是先走客户端的渲染逻辑,然后再发的网络请求,网络不好的情况下应该会经过重试过程,如果最终还是失败,则显示网络原因失败的字样

啪自己

双击自己头像,会显示「你拍了拍自己」,只是双击用户信息是自己的情况下这样显示,这没什么特别的,但是请求失败情况下的文案没太能对上,仍然显示的是「对方可能不知道你拍了他」,猜测这个文案是写在客户端的,可能要改的话又得更新版本喽

实现

其实主要用了一个动画,然后使用TweenSequence进行多组补间动画

 TweenSequence<double>([
      //使用TweenSequence进行多组补间动画
      TweenSequenceItem<double>(tween: Tween(begin: 0, end: 10), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: 10, end: 0), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: 0, end: -10), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: -10, end: 0), weight: 1),
    ])
复制代码

然后封装成了个动画组件,组件调用了Transform来进行转动;

封装的那个组件继承了AnimatedWidget,然后调用了super把自定义的listenable 传了进去,


class AnimateWidget extends AnimatedWidget {
  final Widget child;

  AnimateWidget({Animation<double> animation, this.child})
      : super(listenable: animation);

  @override
  Widget build(BuildContext context) {
    final Animation<double> animation = listenable;
    var result = Transform(
      transform: Matrix4.rotationZ(animation.value * pi / 180),
      alignment: Alignment.bottomCenter,
      child: new ClipRRect(
        borderRadius: BorderRadius.all(Radius.circular(5)),
        child: this.child,
      ),
    );
    return result;
  }
}
复制代码

也算是非常简单。

代码所在位置

封装之后的代码所在

/wechat_flutter/lib/ui/view/shake_view.dart

然后项目中头像调用啪一啪的地方在

/wechat_flutter/lib/ui/message_view/msg_avatar.dart

大家可以去看下具体是怎么调用和封装的;

封装后的代码

import 'dart:math';

import 'package:flutter/material.dart';

/// 封装之后的拍一拍
class ShakeView extends StatefulWidget {
  final Widget child;

  ShakeView({
    this.child,
  });

  _ShakeViewState createState() => _ShakeViewState();
}

class _ShakeViewState extends State<ShakeView>
    with SingleTickerProviderStateMixin {
  Animation<double> animation;
  AnimationController controller;

  initState() {
    super.initState();

    controller = AnimationController(
        duration: const Duration(milliseconds: 500), vsync: this);
    animation = TweenSequence<double>([
      //使用TweenSequence进行多组补间动画
      TweenSequenceItem<double>(tween: Tween(begin: 0, end: 10), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: 10, end: 0), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: 0, end: -10), weight: 1),
      TweenSequenceItem<double>(tween: Tween(begin: -10, end: 0), weight: 1),
    ]).animate(controller);
    controller.forward();
  }

  Widget build(BuildContext context) {
    return AnimateWidget(animation: animation, child: widget.child);
  }

  dispose() {
    controller.dispose();
    super.dispose();
  }
}

class AnimateWidget extends AnimatedWidget {
  final Widget child;

  AnimateWidget({Animation<double> animation, this.child})
      : super(listenable: animation);

  @override
  Widget build(BuildContext context) {
    final Animation<double> animation = listenable;
    var result = Transform(
      transform: Matrix4.rotationZ(animation.value * pi / 180),
      alignment: Alignment.bottomCenter,
      child: new ClipRRect(
        borderRadius: BorderRadius.all(Radius.circular(5)),
        child: this.child,
      ),
    );
    return result;
  }
}
复制代码

调用例子

这个child就是你要啪一啪之后抖动的widget内容

new ShakeView(
    child: new Image.network(
    'url',
    height: 50,
     width: 50,
     fit: BoxFit.cover,
   ),
)
复制代码

项目地址

flutter全套学习教程+教学视频:https://github.com/Timdk857/Android-Architecture-knowledge-2-

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最近很火的微信啪一啪猜猜是怎样通过Flutter实现的? 的相关文章

  • Android:使用 OAuth 访问 google 任务时出现问题

    由于 google 任务没有公共 api 我想编写解决方法并像浏览器一样请求数据 然后解析结果以进一步显示 为了访问数据 我使用 google 实现了 OAuth 身份验证来访问此 url https mail google com htt
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • 带有一、二和三个按钮的 Android 警报对话框

    我不经常发出警报 但每次发出警报时 我都会花一些时间来阅读文档 https developer android com guide topics ui dialogs html并弄清楚如何去做 由于我现在不得不这样做几次 所以我将在下面写一
  • 播放 SoundCloud 曲目

    我可以在 Android 应用程序中播放 SoundCloud 中的曲目吗 我正在尝试这段代码 但它不起作用 String res https api soundcloud com tracks 84973999 stream client
  • 从 React Native Js 代码调用 Android Native UI 组件方法

    我创建了一个 CustomView SignatureView java 它扩展了 LinearLayout 以捕获 Android Native 中的签名 并创建了SignatureCapturePackage java和Signatur
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • Camera.open()返回NULL Android开发

    我正在按照构建相机应用程序的教程进行操作http developer android com tools device html http developer android com tools device html我对 Camera o
  • Android 服务是否有办法检测设备何时锁定?

    我有一个 Android 服务 我希望在设备锁定时执行操作 我想澄清一下 我对屏幕开 关状态不感兴趣 我知道如何使用带有 Intent ACTION USER PRESENT 和 KeyguardManager inKeyguardRest
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • 在游戏视图下添加 admob

    我一直试图将 admob 放在我的游戏视图下 这是我的代码 public class HoodStarGame extends AndroidApplication Override public void onCreate Bundle
  • 哪些 Flutter 插件或功能可以利用外部 iOS/Android 显示器来显示与主显示器不同的内容

    我正在构建一个跨平台应用程序 需要在外部显示器上显示不同的视图 通常通过连接到 LCD 投影仪的 HDMI 适配器电缆连接 Flutter 是否能够在内置的外部显示器上显示不同的屏幕 在现有的 Flutter 插件中还是使用现有的 Flut
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • 如何在 Flutter App 中按时间注销?

    如果用户在登录后对应用程序没有反应或不活动超过 5 分钟 我需要从应用程序中注销用户 该应用程序将转到主登录页面 我尝试实施给定的解决方案here https stackoverflow com questions 52602606 how
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • 尝试将 SQLite DB 从数据复制到 SD 卡

    我正在使用以下代码 该代码发布在 Stack Overflow 上的某个位置 并根据我的目的进行了修改 try File sd Environment getExternalStorageDirectory File data Enviro
  • 在Android Studio gradle项目中使用NDK和STL

    我在将 stlport 链接到 Android Studio 中的 gradle 项目时遇到问题 使用 NDK 的 Eclipse Android 项目迁移到 Android Studio 该项目使用 STL 我有包含内容的 android

随机推荐

  • IDEA主菜单栏不小心按消失了的解决方法

    如图所示 这两行的消失解决方法如下 第一行 在代码区按两下shift键 出现搜索栏 在搜索栏里输入view 如下 这里没有找到Main Menu 点击左下方的很小的more 显示如下 找到Main Menu 点击使其变为ON即可 第二行 点
  • 【C++】map/multimap容器

    1 map基本概念 2 map构造和赋值 include
  • numpy如何将数组元素全部输出,不折叠展示!

    在print之前添加 np set printoptions threshold np inf 将数组的元素全部打印出来 添加前 添加后
  • 本网站服务器。。。。。。。。这句话是什么意思呢?

    网站一般是建立在服务器中 服务器一般是由中央机房管理 所以中央机房在哪个国家地区 一般是由当地的政府进行管理 其他的地方暂时无法管理 今天我们在分享一些写真壁纸 更多写真壁纸 可以关注公众号 优星馆
  • python导入模块的变量,使用python中的变量导入模块

    本问题已经有最佳答案 请猛点这里访问 我有一个即时导入模块的脚本 由于模块名称会在新版本出现时立即更改 因此很难检查脚本中的特定模块名称是否也发生了更改 因此 我将模块名保存在脚本顶部的变量中 如本例中所示 var1 moduleName1
  • 我接手前同事写的烂Java代码,不小心搞出了一个内存泄露事故

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 String 字符串在内存里是如何存储的 String intern 方法 String 字符串是如何引发内存泄漏呢 总结 今天给大家聊聊咱们平时写代码的时候
  • 【python】12.比较运算符与逻辑运算符

    比较运算符 运算符 描述 示例 判断相等 如果两个操作数的结果相等 则条件结果为真 True 否则条件结果为假 False a 3 b 3 则 a b 为True 不相等 如果两个操作数的结果不相等 则条件结果为真 True 否则条件结果为
  • Springbot启动报错-类文件具有错误的版本 61.0, 应为 52.0

    这是由于Spring6以及SprinBoot3 0开始最低支持JDK17 所以如果springboot版本设置过高 而jdk过低的话 就会报该错误 可以降低springboot或是提高jdk版本 降低springboot方式如下 打开pom
  • 【xshell】xshell 自动换行设置

    1 概述 linux连接终端使用从putty切换到xshell时 发现xshell中在显示长文本时不会自动换行 甚是郁闷 查看官方文档 解决方法为启用xshell中VT模式下的Auto Wrap Mode 搞定 如下图 初始VT模式 Aut
  • RTThread中falut定位方法

    RTThread中fault定位方法 在 RTThread中HardFault Handler分析 一文中已经分析了RTThread中对于fault中断的处理方法 接下来讲解如何根据错误输出信息对程序出现fault的位置进行定位 rtthr
  • Python基础(list列表的扩展方式和dict的用法)

    一 list列表扩展的方式有几种 或者说添加元素的方法 1 append 将对象追加到列表中最后一个元素的末尾 2 extend 通过从可选对象追加元素来扩展列表 3 insert 在索引前插入对象 以此来扩展列表 二 对 cherry l
  • 车与羊的选择

    电影 决胜21点 开始部分 课堂上教授问了这样一个问题 假设你正在参加一个电视游戏节目 被要求在三扇门中选择一扇 其中一扇后面有一辆车 其余两扇后面则是羊 你选择了一扇门 假设是1号门 这时候不知什么原因 主持人 他知道各个门后面都有什么
  • Typec协议之PD通信消息详解一

    Messages 消息由消息头和可变长度 包括零 数据部分组成 消息 头 数据 格式如下图 1 只包含头消息 其它为PHY Layer 2 包含消息头和数据消息 3 包含消息头和数据消息 和扩展的消息 Message Header 从表中可
  • 学习笔记--Verilog HDL高级数字设计--第六章组合逻辑与时序逻辑的综合

    组合逻辑与时序逻辑的综合 综合引擎能够自动完成一组布尔函数的最简化 并将结果映射成能满足设计目标的硬件实现 转换 优化 映射 本章将介绍如何编写易于综合的Verilog模型 综合工具完成的工作 1 检测并消除冗余项 2 查找组合反馈环路 3
  • 模糊c均值聚类_模式识别:K均值算法&模糊c均值算法的应用

    1 背景介绍 在实际应用场景中我们会遇见很多无监督分类的任务 样本不具有类别标注 我们无法通过有监督学习设计分类器 基于样本间相似性度量的聚类方法是无监督学习的重要组成部分 一般来说 聚类准则是根据样本之间的距离或相似程度来定义的 通常将相
  • mysql死锁问题分析

    线上某服务时不时报出如下异常 大约一天二十多次 Deadlock found when trying to get lock Oh My God 是死锁问题 尽管报错不多 对性能目前看来也无太大影响 但还是需要解决 保不齐哪天成为性能瓶颈
  • EDK2编译记录

    EDK2 EDK2 PLATFORM EDK2 NON OSI 以上三个仓库 EDK2是主仓库 EDK2 PLATFORM是和EDK2版本对应的板子和CPU相关的仓库 比如树莓派的就在这个里面 EDK2 NON OSI是有一些license
  • 表的读写分离的优缺点?

    读写分离是一种常见的数据库优化策略 将数据库的读操作和写操作分别分配给不同的数据库实例处理 以下是读写分离的优缺点 优点 提升读取性能 通过将读操作分发到专用的读库 可以减轻主库的读取压力 提升整体的读取性能 横向扩展能力 读写分离方案为系
  • Mesa学习笔记#1:Running MESA

    Mesa学习笔记 1 Running MESA Running MESA 关于如何使用MESA来演化一颗恒星 MESA DIR 目录有许多子目录 这些子目录中的大多数都是模块 MESA中的 M 它们提供一些特定的功能 例如 kap 提供计算
  • 最近很火的微信啪一啪猜猜是怎样通过Flutter实现的?

    作者 CrazyQ1 链接 https juejin im post 5eeb49a1e51d4573c91b91ab 最近这个啪一啪效果挺火的啊 群里经常有人啪 介绍 其实之前我就双击过头像 但并没任何效果 估计是当时把这个啪一啪消息隐藏