有点意思,

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. [技术博客]Pyqt中View类别容器和Widget类别容器的区别

    Pyqt中View类别容器和Widget类别容器的区别 简介 在beta迭代中,我们选择用pyqt5来重写alpha迭代中使用tkinter库编写的界面. ​ 按钮之类的与tkiner使用无异,在显示 ...

  2. vue中select设置默认选中

    vue中select设置默认选中 一.总结 一句话总结: 通过v-model来:select上v-model的值为option默认选中的那项的值(value) 二.select设置默认选中实例 < ...

  3. SpringBoot——配置文件占位符

    在配置文件中采用: ${random.int} 获取一个随机值.

  4. JAXB xml序列化应注意

    使用JAXB将对象序列化为XML时,发现有一个地方性能非常低,即 JAXBContext.newInstance(XXX.class); 建议将其提前创建好并作为变量保存,到时可直接使用其引用,而非重 ...

  5. 大数据常见端口汇总-hadoop、hbase、hive、spark、kafka、zookeeper等(持续更新)

    常见端口汇总:Hadoop:        50070:HDFS WEB UI端口    8020 : 高可用的HDFS RPC端口    9000 : 非高可用的HDFS RPC端口    8088 ...

  6. ubuntu 本地生成被浏览器信任的证书

    vhosts添加https证书两步: 1:生成证书: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl ...

  7. 【转载】 CUDA_DEVICE_ORDER 环境变量说明 ( ---------- tensorflow环境下的应用 )

    原文地址: https://www.jianshu.com/p/d10bfee104cc ------------------------------------------------------- ...

  8. Dubbo的设计结构和工作原理

    (1)设计结构 Provider:暴露服务方称之为“服务提供者”. Consumer:调用远程服务方称之为“服务消费者”. Registry:服务注册与发现中心的目录服务称之为“服务注册中心”. Mo ...

  9. 【python基础】easydict的安装与使用

    前言 easydict允许以属性的方式访问dict类型,且可以递归地访问,使用起来比较方便. 安装 pip install easydict 使用 参考 1. easydict; 完

  10. 使用termux在安卓手机上搭建python开发环境

    下载安装termux应用. 应用链接如下:https://download.csdn.net/upload/11342944设置-应用-termux赋予存储权限 cd mkdir .termux vi ...