91.动画的简单使用
動畫繼承結(jié)構(gòu)圖如下所示
QAbstractAnimation 抽象動畫
- QAnimationGroup 動畫組
- QParallelAnimationGroup 同時做的動畫組
- QSequentialAnimationGroup 順序做的動畫組
- QPauseAnimation 暫停動畫
- QVariantAnimation 變體動畫
- QPropertyAnimation 屬性動畫
目錄
1??動畫使用步驟
1.1??構(gòu)造動畫對象并設(shè)置目標屬性
1.1.1??構(gòu)造函數(shù)
1.1.2??添加屬性
1.1.3??添加對象
1.2??設(shè)置開始值,結(jié)束值
1.3??設(shè)置時長 setDuration()
1.4??啟動動畫
2??完善步驟
2.1??尺寸更改 size
2.2??位置和大小 geometry
2.3??窗口不透明度 windowOpacity
2.4??設(shè)置插入值 setKeyValueAt()
2.5??設(shè)置動畫速度曲線 setEasingCurve()
3??QVariantAnimation
4??QAbstractAnimation 方法
4.1??循環(huán)操作
4.1.1??設(shè)置 setLoopCount()
4.1.2??獲取一共循環(huán)幾次 loopCount()
4.1.3??獲取當前是第幾次循環(huán) currentLoop()
4.1.4??獲取當前循環(huán)內(nèi)進行的時間 currentLoopTime()
4.2??時間操作
4.3??動畫方向
4.3.1??設(shè)置 setDirection()
4.3.2??獲取 direction()
4.4??常用操作
4.5??動畫狀態(tài)
4.6??狀態(tài)案例
5??常用信號
6??動畫組
6.1??QAnimationGroup
6.2??QParallelAnimationGroup 并行動畫
6.3??QSequentialAnimationGroup 串行(順序)動畫
6.3.1??加入暫停動畫
6.3.2??獲取當前動畫
6.3.3??信號
1??動畫使用步驟
我們使用QPropertyAnimation做一個例子
直接父類是QVariantAnimation,用于實現(xiàn)屬性值變換時的動畫,我們使用時大概分為下面這幾步
我們首先創(chuàng)建一個按鈕
1.1??構(gòu)造動畫對象并設(shè)置目標屬性
1.1.1??構(gòu)造函數(shù)
這個構(gòu)造函數(shù)有兩種寫法,一種是直接寫父對象,第二種是把目標和屬性也寫進去
1.1.2??添加屬性
如果在這里只寫入了父對象,也可以通過類中的方法添加屬性
后面的參數(shù)需要一個字節(jié)類型的值,我們這樣寫,這個的意思就是做動畫對象的pos這個屬性
- 可以使用dynamicPropertyNames()獲取對象的所有屬性,這個在4.QObject的基本用法2.1 中提到過
1.1.3??添加對象
我們做一個例子
創(chuàng)建一個動畫對象,作用目標是btn,作用屬性是pos
也可以寫到一起
1.2??設(shè)置開始值,結(jié)束值
我們現(xiàn)在設(shè)置開始值和結(jié)束值,讓目標從(0,0)移動到(100,100)
1.3??設(shè)置時長 setDuration()
我們現(xiàn)在設(shè)置動畫時長為3000ms
1.4??啟動動畫
我們現(xiàn)在直接令其打開窗口就啟動動畫,所以在代碼后面直接加start()就可以了
運行之后確實發(fā)現(xiàn)按鈕在移動
2??完善步驟
在更改屬性中,我們常用的屬性有下面這四個
剛才我們測試過了pos,現(xiàn)在我們測試別的
2.1??尺寸更改 size
這樣這個按鈕就用從小變大了
2.2??位置和大小 geometry
這個屬性的含義是尺寸與位置的結(jié)合
對應(yīng)變量類型為QRect(),前面兩個值為位置,后面兩個值為大小,QRect(x,y,寬,高)
這個動畫就會改變位置和大小
2.3??窗口不透明度 windowOpacity
它的取值范圍是[0,1]中所有浮點數(shù),1是不透明,0是透明
我們現(xiàn)在從透明 變到 不透明
2.4??設(shè)置插入值 setKeyValueAt()
我現(xiàn)在想讓窗口一次從 透明 變到 不透明,然后再從 不透明 變到 透明,這個時候我們需要用到插值
第一個參數(shù)是在動畫進行到什么時候變?yōu)楹竺娴闹?#xff0c;取值[0,1]之間所有浮點數(shù),第二個參數(shù)是變成的值
我們也可以使用setKeyValueAt()代替結(jié)束值
經(jīng)測試效果相同
可以插入多個插值
2.5??設(shè)置動畫速度曲線 setEasingCurve()
這個是對動畫的速度進行設(shè)置,我們?nèi)绻麤]設(shè)置的話就是勻速進行動畫,如果設(shè)置就會變速進行動畫,不光是移動可以使用動畫速度曲線,改變透明度,改變尺寸也可以使用動畫速度曲線
- 感覺上還是插入值好用一些
在官方文檔中可以查看取什么值
也可以在庫中的py文件中查看,這個我就不每個都試一遍了
BezierSpline = 45 CosineCurve = 44 Custom = 47 InBack = 33 InBounce = 37 InCirc = 25 InCubic = 5 InCurve = 41 InElastic = 29 InExpo = 21 InOutBack = 35 InOutBounce = 39 InOutCirc = 27 InOutCubic = 7 InOutElastic = 31 InOutExpo = 23 InOutQuad = 3 InOutQuart = 11 InOutQuint = 15 InOutSine = 19 InQuad = 1 InQuart = 9 InQuint = 13 InSine = 17 Linear = 0 OutBack = 34 OutBounce = 38 OutCirc = 26 OutCubic = 6 OutCurve = 42 OutElastic = 30 OutExpo = 22 OutInBack = 36 OutInBounce = 40 OutInCirc = 28 OutInCubic = 8 OutInElastic = 32 OutInExpo = 24 OutInQuad = 4 OutInQuart = 12 OutInQuint = 16 OutInSine = 20 OutQuad = 2 OutQuart = 10 OutQuint = 14 OutSine = 18 SineCurve = 43 TCBSpline = 46
下面這個彈簧效果是用的比較多的,可以試一下
3??QVariantAnimation
QVariantAnimation是QPropertyAnimation的直接父類,下面這些方法也都介紹過,就不一一測試了
4??QAbstractAnimation 方法
是所有動畫類對象的基類,我們說一下之前沒涉及到的操作,動畫對象我們還是使用QPropertyAnimation
4.1??循環(huán)操作
4.1.1??設(shè)置 setLoopCount()
我們現(xiàn)在有一個移動位置的動畫
現(xiàn)在我們讓他循環(huán)三次
確實運行了三次
4.1.2??獲取一共循環(huán)幾次 loopCount()
我們可以把這個方法綁定給我們做動畫的按鈕
運行之后在每一次做動畫時都按一下按鈕
4.1.3??獲取當前是第幾次循環(huán) currentLoop()
也是一樣,綁在按鈕上,每做一次動畫點擊一次
4.1.4??獲取當前循環(huán)內(nèi)進行的時間 currentLoopTime()
也是一樣,綁在按鈕上,每做一次動畫點擊一次
這三個值都是運行的毫秒數(shù)
4.2??時間操作
這個就是字面意思,當前時長是相對于動畫總時長的時長,這三個都是獲取,不做測試了
4.3??動畫方向
參數(shù)QAbstractAnimation.Direction有兩個可選參數(shù)
- 0 - QAbstractAnimation.Forward 正向動畫
- 1 - QAbstractAnimation.Backward 反向動畫
4.3.1??設(shè)置 setDirection()
默認是正向動畫,我們現(xiàn)在設(shè)置為反向動畫
經(jīng)測試,按鈕從(100,100)移動到(0,0)
- 這個例子是改位置屬性,改其他屬性同樣可以更改動畫方向
4.3.2??獲取 direction()
- 如果動畫方向更改,它的時間也會更改,是反著走的,比如說我設(shè)置動畫時間為3000ms,如果正向就是0->3000,如果反向就是3000->0
4.4??常用操作
- start() 動畫開始,在其中可以放動畫的刪除策略
- pause() 動畫暫停
- resume() 動畫繼續(xù)
- stop() 動畫停止
- setCurrentTime() 設(shè)置當前動畫時間
- setPause() 設(shè)置動畫是否暫停,True為暫停,False為不暫停
動畫的刪除策略有兩個可選值
- QAbstractAnimation.KeepWhenStoped 停止時不會刪除動畫
- QAbstractAnimation.DeleteWhenStopped 停止時動畫將自動刪除
- 注:這里的刪除是真的刪除了,刪除之后無法再使用start啟動,也就是說動畫對象被釋放掉了
這個就是字面意思,就不測試了
4.5??動畫狀態(tài)
這個是獲取當前動畫的狀態(tài),有三個返回值
- QAbstractAnimation.Stopped 停止狀態(tài)
- QAbstractAnimation.Paused 暫停狀態(tài)
- QAbstractAnimation.Running 運行狀態(tài)
4.6??狀態(tài)案例
我們對這個狀態(tài)做一個綜合的案例,我們現(xiàn)在有兩個按鈕,一個控制start和stop,一個控制暫停和啟動
當前我有這樣一個動畫
然后我搞兩個按鈕,然后再搞兩個槽函數(shù)
經(jīng)測試可以達到效果
- 點下停止之后它會停在原地,此時使用start()它會從初始位置啟動
5??常用信號
- currentLoopChanged() 完成循環(huán)時觸發(fā),會傳遞當前的循環(huán)輪數(shù)
- directionChanged() 動畫方向改變時觸發(fā),會傳遞當前的方向
- finished() 動畫播放完成時觸發(fā)(如果有循環(huán)就是所有循環(huán)都走完觸發(fā))
- stateChanged() 動畫狀態(tài)改變時觸發(fā),會傳遞兩個參數(shù),第一個為新的狀態(tài),第二個為老的狀態(tài)
6??動畫組
6.1??QAnimationGroup
是動畫組的基類,有以下功能
動畫組使用添加動畫方法就可以添加另一個動畫組
我們一會兒使用子類做例子驗證上面的方法
我們現(xiàn)在做這樣一個動畫,現(xiàn)在有兩個按鈕,紅按鈕順時針走矩形,藍按鈕逆時針走矩形
為了方便看我們把窗口搞大一點,然后放兩個按鈕
先搞紅按鈕的動畫,先用start測試以下,測試后刪掉
發(fā)現(xiàn)可以成功的走
再搞藍按鈕
由于現(xiàn)在是兩個我都使用了start(),所以現(xiàn)在它們是并行運行
6.2??QParallelAnimationGroup 并行動畫
同時執(zhí)行動畫的動畫組
我們現(xiàn)在把start()刪掉,然后創(chuàng)建一個并行動畫組,把兩個動畫加入到動畫組里,然后start
經(jīng)測試可以成功并行執(zhí)行動畫
如果想讓動畫組進行循環(huán),我們直接就可以對動畫組加入循環(huán)
經(jīng)測試有效
6.3??QSequentialAnimationGroup 串行(順序)動畫
順序執(zhí)行動畫的動畫組
發(fā)現(xiàn)可以成功串行執(zhí)行動畫,先移動btn1,后移動btn2
下面三個功能是 QSequentialAnimationGroup 獨有的功能
6.3.1??加入暫停動畫
我們可以在動畫執(zhí)行過程中加入暫停,比如我現(xiàn)在暫停3000ms
這樣btn2會在btn1結(jié)束后3000ms再開始運動
也可以插入暫停
上面的插入暫停和加入暫停效果相同
暫停也算動畫對象的一種,這個類我們在上面的繼承結(jié)構(gòu)圖看過,在這
在QPauseAnimation中有設(shè)置暫停時長setDuration()這一功能
6.3.2??獲取當前動畫
獲取當前播放的動畫,暫停也算動畫一種,如果此時處于暫停狀態(tài)算暫停動畫
6.3.3??信號
當播放動畫發(fā)生改變時觸發(fā)該信號,會傳遞當前的動畫對象
先是由btn1切換到暫停動畫觸發(fā)一次,然后暫停動畫切換到btn2又觸發(fā)一次
總結(jié)
以上是生活随笔為你收集整理的91.动画的简单使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML5之图片标签
- 下一篇: 笔记本电脑不显示电量图标-2018010