1.State
全部組件均具備默認狀態,該狀態定義對象和屬性值的默認配置。能夠經過向States屬性添加State組件來定義新狀態,以容許組件在不一樣配置之間切換.
許多用戶界面設計都是由State狀態實現的,好比: 交通訊號將根據其State配置來實現紅黃綠燈交錯亮滅.
在QML中,狀態是在State對象中定義的一組屬性配置。例如,下面幾種用State狀態最爲方便:canvas
全部基於Item的對象都有一個states屬性和state屬性:ide
對於非Item對象能夠經過StateGroup組件配合來使用State便可函數
1.1 State對象屬性動畫
1.2 Change對象spa
當一個對象的狀態發生改變,那麼該對象展現給用戶的效果也會相應發生改變,因此State支持了多個不一樣Change對象供咱們使用,有以下幾種:設計
因爲幫助手冊都有不少示例,因此咱們以PropertyChanges爲例,來實現一個交通燈3d
1.3 交通燈示例對象
咱們以交通訊號爲例,根據其State配置來實現紅黃綠燈交錯亮滅.效果以下所示:blog
代碼以下所示:繼承
Window { width: 300; height: 400; visible: true; property var delayCnt: 0 Rectangle { anchors.fill: parent gradient: Gradient { GradientStop { position: 0.0; color: "#14148c" } GradientStop { position: 0.699; color: "#14aaff" } GradientStop { position: 0.7; color: "#80c342" } GradientStop { position: 1.0; color: "#006325" } } } Canvas { id: canvas anchors.centerIn: parent width: 80 height: 300 onPaint: { var ctx = getContext("2d") ctx.fillStyle = "black" ctx.fillRect(0,0,width,height-90) ctx.fillRect(width/2 -15,height-90,30,90) } } Column { id: leds anchors.centerIn: canvas anchors.verticalCenterOffset: -45 spacing: 15 state: delayCnt < 5 ? "red" : delayCnt < 10 ? "green" : delayCnt < 14 ? (delayCnt%2==0 ? "green" : "") : "yellow"; Rectangle { id : redLed width: 50; height:50 radius: width/2 color: "red" opacity: 0.2 } Rectangle { id : yellowLed width: 50; height:50 radius: width/2 color: "yellow" opacity: 0.2 } Rectangle { id : greenLed width: 50; height:50 radius: width/2 color: "green" opacity: 0.2 } states: [ State { name: "red" PropertyChanges { target: redLed; opacity: 1} }, State { name: "yellow" PropertyChanges { target: yellowLed; opacity: 1} }, State { name: "green" PropertyChanges { target: greenLed; opacity: 1} } ] } Timer { interval: 500 repeat: true running: true onTriggered: { delayCnt = (delayCnt+1)%18 console.log(delayCnt,leds.state) } } }
2.Transition
Transition用來當State發生改變時產生的一個過渡動畫(有Transition的地方就會有State出現),使得狀態改變動加平滑。
而且全部基於Item的對象都有一個transitions屬性,是一個list<Transition>類型,保存着該對象全部的Transtion,只要當該對象的state發生改變時,就會去遍歷transitions屬性,若是有知足條件的,則產生一個過渡動畫.
給transitions賦值和給states賦值同樣,假如只有一個Transition,那麼咱們能夠直接這樣寫:
transitions: Transition { ... ... }
假若有多個Tansition,能夠這樣寫:
transitions: [ Transition { ... ... }, Transition { ... ... } ]
2.1 Transition對象屬性
2.2 使用串行動畫時注意
2.3 在交通燈基礎上添加過渡動畫
咱們在上個示例的leds對象中添加下面代碼:
transitions: Transition { PropertyAnimation { target: redLed; property: "opacity"; duration: 400} PropertyAnimation { target: yellowLed; property: "opacity"; duration: 400} PropertyAnimation { target: greenLed; property: "opacity"; duration: 400} }
最終效果以下所示: