溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果

發(fā)布時間:2022-06-06 13:40:48 來源:億速云 閱讀:206 作者:iii 欄目:開發(fā)技術(shù)

這篇“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”文章吧。

Hero 的定義

Hero 組件是一個 StatefulWidget,構(gòu)造方法如下:

const Hero({
  Key? key,
  required this.tag,
  this.createRectTween,
  this.flightShuttleBuilder,
  this.placeholderBuilder,
  this.transitionOnUserGestures = false,
  required this.child,
})

其中 createRectTween 就是一個矩形插值,用于控制 Hero 組件的路徑。實(shí)際上,和普通動畫一樣,也是有一個時間曲線,取值范圍是0-1.0,然后createRectTween保證 Hero 組件動畫前后能夠達(dá)到矩形指定位置和大小。下面一張圖是官網(wǎng)的說明圖:

Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果

RectTween

RectTween 和 Tween類似,實(shí)際上就是矩陣在動畫過程中的變化。我們來看 RectTween 的定義:

class RectTween extends Tween<Rect?> {
  RectTween({ Rect? begin, Rect? end }) : super(begin: begin, end: end);

  /// 通過給定的動畫時間值構(gòu)建新的插值矩形
  @override
  Rect? lerp(double t) => Rect.lerp(begin, end, t);
}

這個類很簡單,其實(shí)就是每次動畫時間點(diǎn)上調(diào)用 Rect.lerp 構(gòu)建一個插值的矩形。Rect.lerp 方法如下:

static Rect? lerp(Rect? a, Rect? b, double t) {
    assert(t != null);
    if (b == null) {
      if (a == null) {
        return null;
      } else {
        final double k = 1.0 - t;
        return Rect.fromLTRB(a.left * k, a.top * k, a.right * k, a.bottom * k);
      }
    } else {
      if (a == null) {
        return Rect.fromLTRB(b.left * t, b.top * t, b.right * t, b.bottom * t);
      } else {
        return Rect.fromLTRB(
          _lerpDouble(a.left, b.left, t),
          _lerpDouble(a.top, b.top, t),
          _lerpDouble(a.right, b.right, t),
          _lerpDouble(a.bottom, b.bottom, t),
        );
      }
    }
  }

在矩形 a 和矩形 b 都不為空的時候,返回的就是一個通過定點(diǎn)定義的新的矩形。這里的關(guān)鍵是_lerpDouble 方法,其實(shí)最終就是根據(jù)動畫時間完成頂點(diǎn)的移動。

double? lerpDouble(num? a, num? b, double t) {
  /// ...
  return a * (1.0 - t) + b * t;
}

也就是從矩形 a  的頂點(diǎn)逐步移動到矩形 b的頂點(diǎn),從而完成了兩個矩形的動畫過渡。有了這個基礎(chǔ)我們就可以構(gòu)建自定義的 RectTween 了。和我們的之前說過的動畫曲線(動畫曲線天天用,你能自己整一個嗎?看完這篇你就會了?。┦穷愃频?。

自定義RectTween

我們來一個自定義 RectTween,然后保證起始點(diǎn)是矩形 a,結(jié)束點(diǎn)是矩形 b,然后中間沿曲線變動就可以了。下面是我們利用曲線將時間轉(zhuǎn)換后得到的一個自定義 RectTween。其中使用曲線轉(zhuǎn)換后的transformT取值還是從0-1.0,然后使用_rectMove 方法就能實(shí)現(xiàn)從開始的矩形過渡到結(jié)束的矩形了。

class CustomRectTween extends RectTween {
  final Rect begin;
  final Rect end;

  CustomRectTween({required this.begin, required this.end})
      : super(begin: begin, end: end);

  @override
  Rect lerp(double t) {
    double transformT = Curves.easeInOutBack.transform(t);

    var rect = Rect.fromLTRB(
        _rectMove(begin.left, end.left, transformT),
        _rectMove(begin.top, end.top, transformT),
        _rectMove(end.right, end.right, transformT),
        _rectMove(begin.bottom, end.bottom, transformT));

    return rect;
  }

  double _rectMove(double begin, double end, double t) {
    return begin * (1 - t) + end * t;
  }
}

以上就是關(guān)于“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI