中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Flutter怎么利用Hero組件實現自定義路徑動畫效果

發布時間:2022-06-06 13:40:48 來源:億速云 閱讀:208 作者:iii 欄目:開發技術

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

Hero 的定義

Hero 組件是一個 StatefulWidget,構造方法如下:

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

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

Flutter怎么利用Hero組件實現自定義路徑動畫效果

RectTween

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

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

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

這個類很簡單,其實就是每次動畫時間點上調用 Rect.lerp 構建一個插值的矩形。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 都不為空的時候,返回的就是一個通過定點定義的新的矩形。這里的關鍵是_lerpDouble 方法,其實最終就是根據動畫時間完成頂點的移動。

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

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

自定義RectTween

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

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;
  }
}

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平利县| 新乐市| 奈曼旗| 马公市| 大连市| 宿迁市| 内丘县| 出国| 大悟县| 长治县| 亚东县| 民权县| 鄂尔多斯市| 鹤壁市| 凤城市| 九龙坡区| 海城市| 灵宝市| 南雄市| 台北县| 友谊县| 当阳市| 寻甸| 正镶白旗| 肇州县| 勃利县| 玛多县| 保德县| 辛集市| 泾阳县| 扶风县| 明光市| 平陆县| 和硕县| 云南省| 三明市| 文化| 合江县| 故城县| 泊头市| 桦川县|