有点意思,

import 'package:flutter/material.dart';
import 'package:rxdart/rxdart.dart'; main()=>runApp(MaterialApp(
home: MyApp(),
)); class MyApp extends StatefulWidget{
@override
State<StatefulWidget> createState() {
return MyAppState();
}
} class MyAppState extends State<MyApp> with TickerProviderStateMixin{
GameController gameController;
AnimationController animationController;
List bricks = <Brick>[]; @override
void initState() {
super.initState();
animationController = AnimationController(vsync: this, duration: Duration(seconds: 2));
gameController = GameController(animationController);
}
@override
Widget build(BuildContext context) {
return SafeArea(child:Scaffold(
body:Container(
width: double.infinity,
height: double.infinity,
child: Column(
children: <Widget>[
Container(child: RaisedButton(child: Text('BTN'),onPressed: (){
gameController.addData();
}),),
StreamBuilder(
stream: gameController.dataBloc.dataBloc.stream,
builder: (context, snapshot){
if(snapshot.hasData){
List dataList = snapshot.data;
bricks = <Brick>[];
dataList.forEach((brickModel){
bricks.add(Brick(brickModel: brickModel,));
});
return Container(
width:350, height:400,
child: Stack(
children: bricks,
),); }else{
return Center(child: CircularProgressIndicator(),);
}
},
),
],
),
)));
}
} class Brick extends StatelessWidget {
Brick({this.brickModel});
BrickModel brickModel;
@override
Widget build(BuildContext context) {
print('$hashCode, x: ${brickModel.x}, y: ${brickModel.y}');
return Positioned(
left: brickModel.addressX, top: brickModel.addressY,
// left: 100, top: 100,
child: Container(color: Colors.red,child: Text('${brickModel.x}'),),
);
}
} class GameController {
GameController(animationController){
this.animationController = animationController;
this.animationController.addListener((){
brickModels.forEach((brickAddress){
brickAddress.update();
});
dataBloc.dataBloc.add(brickModels);
});
this.animationController.addStatusListener((status){
print('status: $status');
});
} AnimationController animationController;
Animation xAnimation;
DataBloc dataBloc = DataBloc();
List brickModels = <BrickModel>[]; addData(){
brickModels.add(BrickModel(x: 120, y: 130, oldX: 30, oldY: 30,addressX: 50, addressY: 50, animationController: animationController));
brickModels.add(BrickModel(x: 200, y: 40, oldX: 130, oldY: 60,addressX: 50, addressY: 50, animationController: animationController)); brickModels.forEach((brickAnimation){
brickAnimation..createAnimation();
});
animationController.forward();
}
} class BrickModel {
double x, y, oldX, oldY, addressX, addressY;
Animation xAnimation, yAnimation;
AnimationController animationController;
createAnimation(){
if(x!=oldX || y!=oldY){
xAnimation = Tween(begin: oldX, end: x).animate(animationController);
yAnimation = Tween(begin: oldY, end: y).animate(animationController);
}
} update(){
if(x!=oldX || y!=oldY){
addressX = xAnimation.value;
addressY = yAnimation.value;
print('updating: x: $x, y: $y');
}else{
print('no need to updated x:$x, y:$y, oldX:$oldX, oldY:$oldY');
}
}
BrickModel({this.x, this.y, this.oldX, this.oldY, this.addressX, this.addressY, this.animationController});
} class DataBloc {
ReplaySubject dataBloc = ReplaySubject();
}

  

练习bloc , 动画的更多相关文章

  1. Flutter 状态管理之BLoC

    在正式介绍 BLoC之前, 为什么我们需要状态管理.如果你已经对此十分清楚,那么建议直接跳过这一节.如果我们的应用足够简单,Flutter 作为一个声明式框架,你或许只需要将 数据 映射成 视图 就可 ...

  2. 动画requestAnimationFrame

    前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...

  3. 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

    CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...

  4. CSS 3学习——animation动画

    以下内容根据官方文档翻译以及自己的理解整理. 1.  介绍 本方案介绍动画(animations).通过动画,开发者可以将CSS属性值的变化指定为一个随时间变化的关键帧(keyframes)的集合.在 ...

  5. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  6. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  7. Visaul Studio 常用快捷键的动画演示

    从本篇文章开始,我将会陆续介绍提高 VS 开发效率的文章,欢迎大家补充~ 在进行代码开发的时候,我们往往会频繁的使用键盘.鼠标进行协作,但是切换使用两种工具会影响到我们的开发速度,如果所有的操作都可以 ...

  8. transtion:过渡动画

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px Monaco; color: #4f5d66 } p.p2 { margin: 0.0px 0 ...

  9. 再谈CAAnimation动画

    CAAnimaton动画分为CABasicAnimation & CAKeyframeAnimation CABasicAnimation动画, 顾名思义就是最基本的动画, 老规矩先上代码: ...

随机推荐

  1. vs2010怎么更改调试时使用的浏览器

    在当前网站的起始网页上右击,在右击菜单中选择 浏览方式 步骤阅读 2

  2. SAS PROC SGPLOT

    OPTIONS LS=MAX PS=MAX NOCENTER USER='.\00@Data'; PROC PRINT DATA=OpenDate;RUN; ODS LISTING GPATH='.\ ...

  3. zookeeper acl认证机制及dubbo、kafka集成、zooviewer/idea zk插件配置

    ZooKeeper的ACL机制 zookeeper通过ACL机制控制znode节点的访问权限. 首先介绍下znode的5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 ...

  4. 利用Superlance监控Supervisor运行状态并实现报警

    Superlance是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信 ...

  5. Laravel 控制器 Controller

    一.控制器存在的意义 路由可以分发请求:路由中还可以引入 html 页面:我们可以在 route/web.php 中搞定一切了:但是如果把业务逻辑都写入到路由中:那路由将庞大的难以维护:于是控制器就有 ...

  6. mysql中字符串的隐藏字符处理

    三步解决mysql字符串的隐藏字符: 1. 隐藏字符导致字符串长度边长,用mysql 自带的 Hex函数让隐藏字符显示真身, 2. 可以拿到隐藏字符的16进制码,然后用windows自带的计算器转化成 ...

  7. Ubuntu 上多版本软件管理方法

    https://linuxize.com/post/how-to-install-gcc-compiler-on-ubuntu-18-04/ sudo apt install software-pro ...

  8. blade-boot操作之Idea使用Mave和Dockerfile文件推送到harbor仓库

    mvn clean package docker:build 错误提示: Failed to execute goal com.spotify:docker-maven-plugin:1.1.0:bu ...

  9. dubbo 报错问题记录:may be version or group mismatch

    凌晨时候钉钉告警群里一直大量报错: 接口异常报警:项目:mp-rest,域名:inside-mp.01zhuanche.com,IP:10.30.3.60,接口地址:/api/v3/driverLog ...

  10. 【实用工具】.fbr格式免费播放器 FBR格式 Free FlashBack Player

    公司培训视频是FBR格式的,之前找了一个播放器还要注册码,太费劲,这个简单版能用就行. 播放器样式 播放效果 下载地址 链接:https://pan.baidu.com/s/1IGCgwfUBYJnG ...