欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

flutter PositionedTransition实现缩放动画

程序员文章站 2022-04-09 13:43:28
本文实例为大家分享了lutter实现缩放动画的具体代码,供大家参考,具体内容如下 flutter 动画状态监听器 animationcontroller //...

本文实例为大家分享了lutter实现缩放动画的具体代码,供大家参考,具体内容如下

flutter 动画状态监听器

animationcontroller

//动画控制器
animationcontroller controller;
//animationcontroller是一个特殊的animation对象,在屏幕刷新的每一帧,就会生成一个新的值,
// 默认情况下,animationcontroller在给定的时间段内会线性的生成从0.0到1.0的数字
//用来控制动画的开始与结束以及设置动画的监听
//vsync参数,存在vsync时会防止屏幕外动画(动画的ui不在当前屏幕时)消耗不必要的资源
//duration 动画的时长,这里设置的 seconds: 2 为2秒,当然也可以设置毫秒 milliseconds:2000.
 controller =
  animationcontroller(duration: const duration(seconds: 2), vsync: this);
 //动画开始、结束、向前移动或向后移动时会调用statuslistener
 controller.addstatuslistener((status) {
  if (status == animationstatus.completed) {
  //动画从 controller.reverse() 反向执行 结束时会回调此方法
  print("status is completed");
  // controller.reset(); 将动画重置到开始前的状态
  //开始执行
  //controller.forward();
  } else if (status == animationstatus.dismissed) {
  //动画从 controller.forward() 正向执行 结束时会回调此方法
  print("status is dismissed");
  //controller.forward();
  }else if (status == animationstatus.forward) {
  print("status is forward");
  //执行 controller.forward() 会回调此状态
  }else if (status == animationstatus.reverse) {
  //执行 controller.reverse() 会回调此状态
  print("status is reverse");
  }
 });

animationcontroller 的常用操作说明

flutter PositionedTransition实现缩放动画

flutter animationstatus 动画状态说明

flutter PositionedTransition实现缩放动画

flutter positionedtransition 实现中心缩放动画

flutter PositionedTransition实现缩放动画

动画开始与结束分析

flutter PositionedTransition实现缩放动画

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_x/base/base_appbar_page.dart';

/**
 * relativerecttween 缩放动画
 */
class relativerecttweenpage extends statefulwidget {
 @override
 state<statefulwidget> createstate() {
 return new relativerecttweenstate();
 }
}

class relativerecttweenstate extends baseappbarpagestate<relativerecttweenpage>
 with singletickerproviderstatemixin {
 //动画控制器
 animationcontroller controller;
 animation<relativerect> animation;

 @override
 string buildinitstate() {
 buildbackbar("动画", backicon: icons.arrow_back_ios);
 controller =
  animationcontroller(duration: const duration(seconds: 2), vsync: this);
 //动画开始、结束、向前移动或向后移动时会调用statuslistener
 controller.addstatuslistener((status) {
  if (status == animationstatus.completed) {
  //动画从 controller.forward() 正向执行 结束时会回调此方法
  print("status is completed");
  //反向执行
  //controller.reverse();
  } else if (status == animationstatus.dismissed) {
  //动画从 controller.reverse() 反向执行 结束时会回调此方法
  print("status is dismissed");
  //controller.forward();
  } else if (status == animationstatus.forward) {
  print("status is forward");
  //执行 controller.forward() 会回调此状态
  } else if (status == animationstatus.reverse) {
  //执行 controller.reverse() 会回调此状态
  print("status is reverse");
  }
 });

 // 这个动画的过程是
 // 子widget 距左边距离从 10.0 变化 到100.0
 // 子widget 距上边距离从 10.0 变化 到100.0
 // 子widget 距右边距离从 10.0 变化 到100.0
 // 子widget 距下边距离从 10.0 变化 到100.0
 // 四边同时变化 相同的距离 倍率,所以看出来是 中心缩小的动画
 relativerecttween recttween = relativerecttween(
  //初始位置设置
  begin: const relativerect.fromltrb(
   //子widget 距父布局 left 10.0
   10.0,
   //子widget 距父布局 top 10.0
   10.0,
   //子widget 距父布局 right 10.0
   10.0,
   //子widget 距父布局 bottom 10.0
   10.0),
  //结束位置设置
  end: relativerect.fromltrb(
   //子widget 距父布局 left 100.0
  100.0,
   //子widget 距父布局 top 100.0
  100.0,
  //子widget 距父布局 right 100.0
  100.0,
  //子widget 距父布局 bottom 100.0
  100.0,
  ),
 );

 //关联 controller
 animation = recttween.animate(controller);

 return null;
 }

 @override
 widget buildwidget(buildcontext context) {
 return buildslidetransition();
 }

 @override
 void dispose() {
 super.dispose();
 controller.dispose();
 }

 //渐变动画
 widget buildslidetransition() {
 return stack(
  children: <widget>[
  //必须作为stack的子widget
  positionedtransition(
   rect: animation,
   child: container(
   color: colors.grey,
   child: image.network(
    "http://img5.duitang.com/uploads/item/201411/16/20141116124947_xbnxm.jpeg",
   ),
   ),
  ),
  positioned(
   bottom: 20,
   left: 20,
   child: flatbutton(
    onpressed: () {
    if (controller.isdismissed) {
     ///正向动画开始
     controller.forward();
    } else if (controller.iscompleted) {
     ///反向动画开始
     controller.reverse();
    } else {
     //停止
     controller.dispose();
     //重置动画
     controller.reset();
    }
    },
    child: text("开始")),
  )
  ],
 );
 }
}

flutter positionedtransition 向上缩放

flutter PositionedTransition实现缩放动画

 relativerecttween recttween = relativerecttween(
  //初始位置设置
  begin: const relativerect.fromltrb(
   50.0,
   50.0,
   50.0,
   50.0),
  //结束位置设置
  end: relativerect.fromltrb(
  50.0,
  50.0,
  50.0,
  500.0,
  ),
 );

flutter positionedtransition 向右缩放

flutter PositionedTransition实现缩放动画

relativerecttween recttween = relativerecttween(
  //初始位置设置
  begin: const relativerect.fromltrb(
   50.0,
   50.0,
   50.0,
   50.0),
  //结束位置设置
  end: relativerect.fromltrb(
  500.0,
  50.0,
  50.0,
  50.0,
  ),
 );

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。