本文分享下自定義完成動畫的實現方法,最終的效果圖如下
原始碼位址
在ios/android中我們繼承uiview/view
重寫draw/ondraw
方法在裡面執行畫圖操作。 在flutter中稍微有點不一樣,我們使用custompaint
(這是乙個widget),它需要乙個引數painter
,這個引數的型別是乙個抽象類custompainter
。 我們需要實現這個類的兩個關鍵方法:paint
,shouldrepaint
。畫什麼就由paint
決定,而只有shouldrepaint
返回true的時候才會重繪。
實現void paint(canvas canvas, size size)
這個方法,在ios中我們使用uibezierpath
和core graphics
繪圖,在flutter具體的繪製方法用這個canvas
, 具體的api可以檢視官方文件
下面這個例子就是畫一段圓弧
class
demopainter
extends
custompainter
@override
bool shouldrepaint(demopainter other)
}複製**
使用的時候把demopainter
的例項當做引數傳給custompaint
就可以使用了,比如
container(
child: custompaint(painter: demopainter(0.0, math.pi)),
height: 200.0,
width: 200.0,
color: colors.deeporange,
padding: edgeinsets.all(30.0),
)複製**
顯示效果
flutter中的動畫是基於animation
,這個物件本身是乙個抽象類,在一段時間內依次產生一些值。我們使用封裝好的animationcontroller
來做動畫,它在螢幕重新整理的每一幀,產生乙個新的值,預設情況是在給定的時間段內線性的生成0.0到1.0的數字。
animationcontroller
有個引數vsync
可以繫結到乙個widget
(需要widget擴充套件singletickerproviderstatemixin
),當widget不顯示時,動畫定時器將會暫停,當widget再次顯示時,動畫定時器重新恢復執行。duration
屬性可以設定持續時間。還有一些方法可以控制動畫forward
啟動,reverse
反轉,repeat
重複。
animationcontroller
有addlistener
和addstatuslistener
方法可以新增監聽,乙個是值監聽乙個是狀態監聽。值監聽常用在呼叫setstate
來觸發ui重建來實現動畫,狀態監聽用在動畫狀態變化的時候執行一些方法,比如在動畫結束時反轉動畫。
至此我們已經可以繪製動畫了,**如下
class
demowidget
extends
statefulwidget
class
_demowidgetstate
extends
state
with
singletickerproviderstatemixin
); });
super.initstate();
} @override
void dispose()
@override
widget build(buildcontext context)
}複製**
可以借助animatedbuilder
改寫上文的initstate
和build
方法,使檢視層級更加清楚,有助於封裝
@override
void initstate()
@override
widget build(buildcontext context) );
}複製**
tween和curve可以幫我們更好地控制animation的值 一般的animation會在給定的時間內線性的產生0.0到1.0的值
tween可以把這些轉變成我們想要的型別或者是範圍 比如tween(begin: math.pi * 1.5, end: math.pi * 1.5 + math.pi * 2).evaluate(_controller),
就可以把值的範圍轉成1.5pi到3.5pi。
curve是乙個抽象類表示生成值的曲線, curves已經定義了許多常用的曲線。
這裡tween
,curve
可以使用chain
,evaluate
,transform
和animation串起來使用
我們可以使用這些更改我們上文的例子,**如下
@override
widget build(buildcontext context) );
}複製**
當然這裡第二個引數有更簡潔的寫法
math.sin(_controller.value*math.pi) *math.pi
複製**
顯示效果 C Winform中繪製動畫的方法
為了方便以後的使用,我將這些 整合到了一起,形成乙個animateimage類,該類提供了cananimate framecount currentframe等屬性,以及play stop reset 等動畫常用的方法,如下 using system using system.collections...
Cocos2d x 繪製動畫
需要說明的是 因為cocos2d x是通用遊戲引擎,為了保證相容性和易用性,對動畫機制作了最簡單的設計 被做成了乙個action 但代價就是繪製動畫的 可能比較多,如果在實際開發中,一般都要選擇自己封裝。最好自己開發乙個編輯器,開發編輯器最好使用qt,因為是跨平台的。在66rpg裡找了一張動畫資源。...
CALayer 自定義屬性繪製動畫
建立circlelayer繼承calayer,新增新屬性angle。inte cecirclelayer calayer property nonatomic,assign cgfloatangle end 覆蓋父類方法,新增新的屬性動畫鍵值,返回yes表示給定的屬性發生變化時導致layer的內容重...