Flutter動畫例項 4缸發動機動畫

2021-09-11 12:35:04 字數 2345 閱讀 5195

根據動畫的內容,需要把它分成幾部分:

其中的動畫,其實只涉及氣缸,左側的發動機主檢視是氣缸上下運動,右側的發動機側檢視是氣缸的上下運動外加連桿的左右旋轉

拆分了結構,下面就來布局,這裡面大量使用了container

這麼多部件疊在一起,所以很直觀的就想到了stack widget,建立乙個容器container,然後child是stack,上面說的各個部件,都放在stack裡,並通過position來指定位置

發動機上蓋

發動機上蓋是個長方形container,通過decoration設定了上部的兩個圓角,以及灰色的背景色。還有就是需要在上蓋上,掏出四個空間,來放置氣缸。

氣缸和連桿

氣缸和連桿,使用的是乙個column來封起來幾個container,氣缸用了5個container來實現活塞環的效果,連桿細長,並且底部有圓角 動畫我們下一節說

曲軸曲軸分成幾部分:曲軸主軸,每個活塞拉桿的連線部分,連線部分包括兩個片狀container和中間的掏空部分(掏空其實就是設定成背景顏色,看起來是掏空的)

這裡只有氣缸和連桿需要有動畫,實現了乙個氣缸的動畫,那四個氣缸也差不多了

活塞的上下運動很簡單,運用補間動畫tween,讓他的值從0~2*pi之間變化,通過sin函式,就可以實現活塞的往復運動

top: shellheight -

cylinderheight -

crankshaftradius -

crankshaftradius * sin(positiontween.evaluate(animation)),

複製**

而且使用sin函式,因為不是線性的,所以也實現了類似ease in out的效果。

右側發動機側檢視的連桿旋轉著實費了些腦筋,倒不是動畫困難,而是曲軸往復運動,與連桿的旋轉角度之間的關係,最後通過測試,發現從0~pi的時候,線性旋轉,pi~2*pi的時候,三角函式旋轉,擬合度比較高,至於旋轉的方法,使用transform widget

transform(

transform:

matrix4.rotationz(connectrodangle(maxangle, positiontween.evaluate(animation))),//旋轉角度

alignment: alignment.topcenter,

child: container(

height: connectrodheight,

width: connectrodwidth,

decoration: boxdecoration(

color: cylindercolor,

borderradius: borderradius.only(

bottomleft: radius.circular(connectrodwidth / 2),

bottomright: radius.circular(connectrodwidth / 2))),),)

複製**

整個實現其實很簡單,想實現乙個複雜動畫,思路整理很重要,不要被動畫的表象繞進去,另外,發動機的各個尺寸和顏色,我都通過全域性宣告,提高**的可維護性,所以現在如果我想把發動機變成8缸,體積也變大,幾乎是10s以內就能完成。

const engineheight = 170.0;

const shellwidth = 200.0;

const shellwidthleft = 70.0;

const shellheight = 100.0;

const shellpadding = 12.0;

const cylinderheight = 18.0;

const cylinderwidth = 35.0;

const connectrodheight = 60.0;

const connectrodwidth = 6.0;

const crankshaftradius = 20.0;

const crankshaftradiuswithborder = crankshaftradius + 3;

const crankshaftrodradius = 5.0;

const crankshaftflatwidth = 4.0;

const cylindercount = 4;

const shellcolor = colors.grey;

const backgroundcolor = colors.yellow;

const cylindercolor = colors.red;

const crankshaftcolor = colors.grey;

複製**

Flutter 動畫使用

效果預覽 旋轉動畫 透明度變換動畫 在android中,可以通過view.animate 對檢視進行動畫處理,那在flutter中怎樣才能對widget進行處理 在flutter中,可以通過動畫庫給widget新增動畫。在android中,您可以通過xml建立動畫或在檢視上呼叫.animate 在f...

Flutter 動畫使用

旋轉動畫 透明度變換動畫 在android中,可以通過view.animate 對檢視進行動畫處理,那在flutter中怎樣才能對widget進行處理 在flutter中,可以通過動畫庫給widget新增動畫。在android中,您可以通過xml建立動畫或在檢視上呼叫.animate 在flutte...

Flutter 動畫入門

flutter動畫基本與前端動畫一致,都是在一定時間內,將乙個值變到另乙個值,利用這個值的變化來實現對介面的控制。class myhomepage extends statefulwidget super key key override myhomepagestate createstate my...