日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Flutter實(shí)現(xiàn)不同縮放動畫效果詳解_Android

作者:JulyYu ? 更新時間: 2022-08-13 編程語言

需求背景

組件縮放可以向著一個方向進(jìn)行縮放,放大列表中某一個Cell期望它是向后進(jìn)行放大而非組件中心點(diǎn)開始縮放。具體效果如下圖所示:

可縮放組件介紹

ScaleTransition

ScaleTransition具體實(shí)現(xiàn)如下代碼,設(shè)置AnimationController控制器若需要增加數(shù)值操作可以再增加Animate再調(diào)用forward方法執(zhí)行。

PS:動畫實(shí)現(xiàn)在以前文章中有介紹過

動畫控制器
_scaleAnimationController = AnimationController(
  vsync: this,
  duration: Duration(milliseconds: 3000),
);
scale = Tween(begin: 1.0, end: 1.29).animate(_scaleAnimationController);

ScaleTransition(
  scale: scale,
  alignment: Alignment.centerLeft,
  child: Container(
    margin: EdgeInsets.all(50),
    color: Colors.yellow,
    height: 200,
    width: 100,
  ),
)


_scaleAnimationController.forward();

如果希望修改縮放方向,可以為ScaleTransition添加alignment配置。例如centerLeft表示組件靠左向右縮放。

ScaleTransition(
  scale: scale,
  alignment: Alignment.centerLeft,
  child: Container(
    margin: EdgeInsets.all(50),
    color: Colors.yellow,
    height: 200,
    width: 100,
  ),
)

如圖所示默認(rèn)縮放是以組件中心點(diǎn)進(jìn)行縮放效果,設(shè)置alignment則向著相反位置進(jìn)行縮放。

ScaleTransition并不能滿足需求功能,無法做到向著一個方向進(jìn)行縮放動畫。

SizeTransition

SizeTransition是以更改子組件尺寸實(shí)現(xiàn)動畫效果,支持垂直或水平方向動畫。

AnimationController _animationController =
    AnimationController(vsync: this, duration: Duration(seconds: 1));
_animationController.value = 1.0;
Animation<double>
  _animation = CurvedAnimation(
    parent: _animationController, curve: Curves.fastLinearToSlowEaseIn);

SizeTransition(
  sizeFactor: _animation,
  axis: Axis.horizontal,
  child: Container(
    color: Colors.blue,
    height: 100,
    width: 100,
    alignment: Alignment.center,
    child: Text("SizeTransition"),
  ),
)

但在需求要求上還是不滿足期望的結(jié)果,SizeTransition更適用在實(shí)現(xiàn)展開或是飛入的動畫效果。

AnimatedSize

AnimatedSize是自帶動畫效果的組件,修改組件尺寸大小就能夠執(zhí)行縮放動畫。

GestureDetector(
  child: AnimatedSize(
    duration: Duration(seconds: 2),
    child: Container(
      color: Colors.red,
      width: 100,
      height: height,
      alignment: Alignment.center,
      child: Container(
        height: 50,
        width: 50,
        color: Colors.yellow,
        child: Text("AnimatedSize"),
      ),
    ),
  ),
  onTap: () {
    height = 150;
    width = 150;
    setState(() {});
  },
),

AnimatedSize的問題在于它只作用于自身,若子布局設(shè)置了自身的尺寸就不會隨著父組件大小而變化。

AnimatedBuilder

AnimatedBuilder主要結(jié)合Transform.scale組件設(shè)置alignmentAlignment.centerLeft即可對組件實(shí)現(xiàn)向右縮放動畫。

AnimationController _scaleAnimationController = AnimationController(
  vsync: this,
  duration: Duration(milliseconds: 3000),
);
Animation<double> scale = Tween(begin: 1.0, end: 1.29).animate(_scaleAnimationController);

 AnimatedBuilder(
  animation: scale,
  builder: (context, widget) {
    return Transform.scale(
      alignment: Alignment.centerLeft,
      scale: scale.value,
      child: widget,
    );
  },
  child: GestureDetector(
    child: Container(
      margin: EdgeInsets.only(left: 15, right: 15),
      color: Colors.blue,
      width: 100,
      height: 50,
      child: Text("AnimatedBuilder"),
    ),
    onTap: (){
      _scaleAnimationController.forward();
    },
  ),
);

AnimatedBuilder方式實(shí)現(xiàn)縮放需要為組件縮放預(yù)留好足夠空間進(jìn)行縮放放大操作,避免組件縮放后與其他組件出現(xiàn)重疊現(xiàn)象。

小結(jié)

實(shí)現(xiàn)縮放方式有多種但對于比較定制化縮放要求需求配合上Transform.scale才能達(dá)到最終效果。Transform.scale可以幫助動畫實(shí)現(xiàn)上對于組件尺寸大小控制方向有所幫助。因此采用AnimatedBuilder結(jié)合Transform.scale是需求實(shí)現(xiàn)最優(yōu)方案。

原文鏈接:https://juejin.cn/post/7111719803614101541

欄目分類
最近更新