国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Flutter進階之實現(xiàn)動畫效果(六)

2019-12-12 00:34:23
字體:
來源:轉載
供稿:網友

上一篇文章中,我們之前對BarChart.lerp的定義并不是高效的,我們正在創(chuàng)建的Bar實例,僅作為Bar.lerp的參數(shù)給出,并且針對動畫參數(shù)t的每個值重復出現(xiàn)。每秒60幀,這意味著可能很多Bar實例被送到垃圾收集器,即使是相對較短的動畫。

我們可以采用以下三種解決方案:

  • Bar實例可以通過在Bar類中僅創(chuàng)建一次而不是每次調用collapsed來重復使用,但這種方法不適合我們的應用程序。
  • 重用可以通過BarChartTween來處理,通過使其構造函數(shù)創(chuàng)建一個列表_tween的BarTween實例,在創(chuàng)建補間條形圖時使用(i) => _tweens[i].lerp(t)。這種方法破壞了使用靜態(tài)方法lerp的慣例,靜態(tài)BarChart.lerp中沒有涉及到任何對象,用于在動畫持續(xù)時間內存儲補間列表。相反,BarChartTween對象完全適合這一點。
  • 假設Bar.lerp中有合適的條件邏輯,可以使用null來表示折疊條,這種方法是非常高效的,但是需要注意避免引用或誤解null。null常用在Flutter SDK中,其中靜態(tài)方法lerp會將null視為動畫終點,通常將其解釋為某種不可見元素,比如完全透明的顏色或零尺寸的圖形元素。在我們的代碼中,lerpDouble將null視為零,除非兩個動畫結束點都為null。

綜合考慮之下,我們使用最后一種解決方案,首先我們需要更新BarChart的部分代碼。

class BarChart { // ... static BarChart lerp(BarChart begin, BarChart end, double t) {  final barCount = max(begin.bars.length, end.bars.length);  final bars = new List.generate(   barCount,   (i) => Bar.lerp(begin._barOrNull(i), end._barOrNull(i), t)  );  return new BarChart(bars); } // ...}

然后我們還需要更新一下Bar的條件邏輯。

class Bar { Bar(this.x, this.width, this.height, this.color); final double x; final double width; final double height; final Color color; static Bar lerp(Bar begin, Bar end, double t) {  if(begin == null && end == null)   return null;  return new Bar(    lerpDouble((begin??end).x, (end??begin).x, t),    // ?:變量可以為null    lerpDouble(begin?.width, end?.width, t),    lerpDouble(begin?.height, end?.height, t),    Color.lerp((begin??end).color, (end??begin).color, t)  ); }}

現(xiàn)在我們的應用程序里,如何將使用折疊的條形作為不可見元素的判斷,寫在Bar.lerp的條件邏輯中,實現(xiàn)我們想要的高效率。換一個角度來看,不知道大家有沒有發(fā)現(xiàn),現(xiàn)在代碼的可維護性已經不如上一個版本了。這就是為什么之前選擇看起來效率較低的解決方案。在性能與可維護性之間選擇,需要通過衡量之后再作出決定。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广宁县| 宝鸡市| 扶风县| 桐庐县| 宾川县| 西昌市| 翁牛特旗| 固安县| 岳阳市| 和田市| 砚山县| 温泉县| 临高县| 新闻| 红原县| 麻阳| 五指山市| 阳泉市| 科技| 都安| 紫金县| 南康市| 大埔区| 望城县| 鄢陵县| 长垣县| 三都| 阜南县| 岑溪市| 嘉峪关市| 昌图县| 应城市| 三穗县| 林芝县| 安塞县| 邵东县| 南涧| 海宁市| 本溪市| 乌恰县| 桐乡市|