QML 動畫效果詳解

屬性動畫(PropertyAnimation)

PropertyAnimation是QML中最基礎、最常用的動畫類型,它可以對任何基于數字或顏色的屬性進行動畫化處理,實現平滑的過渡效果。

核心屬性與用法

PropertyAnimation的主要屬性如下表所示:

屬性類型描述默認值
targetQtObject動畫作用的目標對象父對象
propertystring要動畫化的屬性名必須指定
fromvariant動畫起始值當前屬性值
tovariant動畫結束值必須指定
durationint動畫持續時間(ms)250
easing.typeenumeration緩動曲線類型Easing.Linear
easing.amplitudereal彈性動畫幅度1.0
easing.periodreal彈性動畫周期0.3
loopsint循環次數1
runningbool是否自動運行false
alwaysRunToEndbool停止時是否完成動畫false

基礎示例

import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0// 基本屬性動畫PropertyAnimation {target: rectproperty: "x"to: 200duration: 1000running: true}
}

緩動曲線示例

PropertyAnimation支持多種緩動曲線,可以創建更自然的動畫效果:

PropertyAnimation {property: "rotation"to: 360easing.type: Easing.OutBounceeasing.amplitude: 2.0duration: 1000
}

相對值動畫

PropertyAnimation支持相對當前值的動畫:

PropertyAnimation {property: "x"to: myItem.x + 50  // 相對當前位置移動50像素duration: 500
}

多屬性動畫

可以同時對多個屬性應用動畫:

ParallelAnimation {PropertyAnimation { property: "x"; to: 100 }PropertyAnimation { property: "y"; to: 100 }PropertyAnimation { property: "opacity"; to: 0.5 }
}

PropertyAnimation的強大之處在于它的通用性,幾乎可以對任何QML元素的任何屬性進行動畫處理,是構建動態UI的基礎。

數字動畫(NumberAnimation)

NumberAnimation是PropertyAnimation的派生類,專門用于處理數值類型的屬性動畫,如位置、大小、旋轉角度等。

核心屬性

NumberAnimation繼承了PropertyAnimation的所有屬性,并特別優化了對數值類型的處理:

屬性類型描述默認值
fromreal動畫起始值當前屬性值
toreal動畫結束值必須指定
byreal相對變化量-
其他屬性繼承自PropertyAnimation

基本用法示例

import QtQuick 2.0Rectangle {width: 100; height: 100color: "red"// 數字動畫作為屬性值源NumberAnimation on x {to: 50duration: 1000}
}

三種寫法對比

NumberAnimation有三種主要使用方式:

?方法1:直接綁定屬性?

NumberAnimation on rotation {id: minutePinAnifrom: 0to: 360duration: 20000loops: Animation.Infinite
}

?方法2:獨立動畫對象?

NumberAnimation {id: minutePinAnitarget: minPinproperty: "rotation"to: 360duration: 10000loops: Animation.Infinite
}

?方法3:通過Behavior?

Behavior on rotation {NumberAnimation {from: 0to: 100duration: 20000loops: Animation.Infinite}
}

與RotationAnimation的區別

雖然NumberAnimation可以用于旋轉動畫,但QML提供了專門的RotationAnimation類型,它比NumberAnimation多了一個旋轉方向屬性:

RotationAnimation {target: itemproperty: "rotation"direction: RotationAnimation.Clockwise // 順時針方向from: 0to: 360duration: 1000
}

RotationAnimation的direction屬性可以是:

  • RotationAnimation.Numerical?(默認):數值線性插值
  • RotationAnimation.Clockwise:順時針旋轉
  • RotationAnimation.Counterclockwise:逆時針旋轉
  • RotationAnimation.Shortest:沿最短路徑旋轉

NumberAnimation因其簡單高效,在大多數數值動畫場景中都是首選方案,特別是當需要精確控制數值變化過程時。

預定義的目標和屬性動畫

QML提供了一種更簡潔的語法來定義屬性動畫,即直接在屬性上聲明動畫,這種方式稱為"預定義的目標和屬性動畫"或"on語法"。

基本語法

<AnimationType> on <property> {// 動畫屬性設置
}

典型示例

import QtQuick 2.0Rectangle {id: rectwidth: 100; height: 100color: "red"// 預定義x屬性的動畫PropertyAnimation on x {to: 100duration: 500}// 預定義y屬性的動畫PropertyAnimation on y {to: 100duration: 500}
}

特點與優勢

  1. ?簡潔性?:不需要指定target和property,代碼更簡潔
  2. ?自動綁定?:動畫自動綁定到聲明它的元素的對應屬性
  3. ?自動運行?:這種形式的動畫會在組件加載完成后自動開始運行
  4. ?適用于任何屬性?:可以對任何支持動畫的屬性使用此語法

實際應用案例

import QtQuick 2.15Rectangle {width: 200height: 200anchors.centerIn:  parentcolor: "lightgreen"// 旋轉動畫RotationAnimation on rotation {from: 0to: 360duration: 2000loops: Animation.Infinite}// 縮放動畫ScaleAnimator on scale {from: 0.5to: 1.5duration: 1000loops: Animation.Infinite}// 透明度動畫OpacityAnimator on opacity {from: 0.3to: 1.0duration: 1500loops: Animation.Infinite}}

與獨立動畫的對比

相比于獨立的動畫聲明,預定義語法有以下區別:

特性預定義語法獨立動畫
目標對象隱含(父元素)需顯式指定
屬性綁定自動關聯需顯式指定
執行時機自動開始需手動啟動或設置running
復用性較低較高
代碼量較少較多

預定義的目標和屬性動畫語法非常適合那些簡單、直接的動畫需求,特別是在原型設計或簡單動畫場景中,可以顯著減少代碼量并提高可讀性。

過渡動畫(Transition)

Transition用于定義狀態變化時的動畫效果,它可以在元素從一個狀態切換到另一個狀態時,自動應用指定的動畫。

核心屬性

Transition的主要屬性如下:

屬性類型描述默認值
fromstring起始狀態名"" (任何狀態)
tostring目標狀態名"" (任何狀態)
reversiblebool是否可反向播放false
enabledbool是否啟用過渡true
animationslist動畫列表空列表

基本用法

import QtQuick 2.15Rectangle {id: myRectwidth: 100; height: 100color: "red"state: "state1"MouseArea {anchors.fill: parentonPressed: myRect.state = "state2"onReleased: myRect.state = "state1"}states: [State {name: "state1"PropertyChanges { target: myRect; x: 0; y: 0 }},State {name: "state2"PropertyChanges { target: myRect; x: 100; y: 100 }}]transitions: [Transition {from: "state1"to: "state2"NumberAnimation { properties: "x,y"; duration: 500 }},Transition {from: "state2"to: "state1"NumberAnimation { properties: "x,y"; duration: 300 }}]}

?

多屬性過渡示例

transitions: Transition {// 顏色過渡ColorAnimation { duration: 1000 }// 位置過渡NumberAnimation { properties: "x,y"duration: 500 easing.type: Easing.OutBack}// 旋轉過渡RotationAnimation { duration: 700 direction: RotationAnimation.Clockwise}
}

高級用法:條件過渡

可以根據不同條件應用不同的過渡效果:

transitions: [Transition {from: "*"; to: "dragging"NumberAnimation { property: "scale"; to: 1.2; duration: 200 }},Transition {from: "dragging"; to: "*"SequentialAnimation {NumberAnimation { property: "scale"; to: 1.0; duration: 200 }SpringAnimation { property: "rotation"; spring: 2; damping: 0.2 }}}
]

與Behavior的區別

Transition和Behavior都用于屬性變化時的動畫,但有以下區別:

特性TransitionBehavior
觸發條件狀態變化任何屬性變化
作用范圍狀態切換期間始終有效
控制粒度基于狀態基于屬性
適用場景明確的狀態機持續性的屬性變化

Transition在創建有明確狀態劃分的界面時非常有用,如折疊/展開、激活/非激活等場景,能夠提供清晰的視覺反饋和狀態轉換指示。

默認行為動畫(Behavior)

Behavior是QML中用于對屬性值變化做隱式動畫的機制,它綁定到某個屬性上,當該屬性在運行時被修改時,會自動觸發預定義的動畫效果

核心屬性

Behavior的主要屬性如下:

屬性類型描述默認值
animationAnimation屬性變化時應用的動畫必須指定
enabledbool是否啟用行為動畫true

基本語法

Behavior on <property> {<animation>
}

基礎示例

import QtQuick 2.15Rectangle {width: 100; height: 100color: "red"// 為x坐標變化添加行為動畫Behavior on x {NumberAnimation { duration: 500 }}MouseArea {anchors.fill: parentonClicked: parent.x = parent.x + 50}
}

常見內置Animation類型

Behavior可以與多種動畫類型配合使用:

類型可動畫化屬性說明
NumberAnimation數值型(x, y, width...)通過線性或緩動曲線插值數值
ColorAnimationcolor, border.color...在兩個顏色值之間漸變
RotationAnimationrotation對旋轉角度做插值動畫
ScaleAnimationscale對縮放因子做插值
SpringAnimation任意數值型彈簧阻尼動畫,帶回彈效果
SmoothedAnimation任意數值型平滑快速跟隨目標值

組合多個動畫

Behavior內部可以使用組合動畫實現復雜效果:

Behavior on width {SequentialAnimation {NumberAnimation { duration: 300; easing.type: Easing.OutQuad }PauseAnimation { duration: 100 }NumberAnimation { duration: 200; easing.type: Easing.InQuad }}
}

條件性行為

可以動態啟用或禁用Behavior:

Rectangle {id: rectproperty bool animationsEnabled: trueBehavior on x {enabled: rect.animationsEnabledNumberAnimation { duration: 200 }}
}

注意事項

  1. ?初始化賦值不會觸發?:組件創建時的初始設定不會觸發Behavior動畫
  2. ?性能考慮?:不要對大量快速變化的屬性綁定耗時動畫
  3. ?多重Behavior?:一個屬性只能有一個Behavior,但可以在內部使用ParallelAnimation/SequentialAnimation
  4. ?與visible屬性?:對visible屬性直接應用Behavior無效,可以改為對opacity應用動畫然后綁定visible到opacity > 0

Behavior的主要優勢在于它能夠降低動畫調用成本,無需在每次更改時手動啟動動畫,只需在組件聲明里一次性配置,后續所有對該屬性的改變都會平滑地過渡。

并行動畫與序列動畫(ParallelAnimation和SequentialAnimation)

QML提供了兩種組合動畫的方式:ParallelAnimation(并行動畫)和SequentialAnimation(序列動畫),它們作為容器可以嵌套其他動畫元素,實現復雜的動畫效果。

ParallelAnimation(并行動畫)

ParallelAnimation允許所有子動畫同時運行,適用于需要多個屬性同步動畫的場景。

核心屬性
屬性類型描述默認值
animationslist子動畫列表空列表
runningbool是否運行false
loopsint循環次數1
alwaysRunToEndbool停止時是否完成當前動畫false
基本示例
import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0; opacity: 1.0ParallelAnimation {running: trueNumberAnimation { target: rect; property: "x"; to: 200; duration: 1000 }NumberAnimation { target: rect; property: "y"; to: 200; duration: 1500 }PropertyAnimation { target: rect; property: "opacity"; to: 0.5; duration: 800 }}
}
動態添加動畫

ParallelAnimation支持動態添加子動畫:

ParallelAnimation {id: dynamicAnim
}function addScaleAnimation() {var anim = Qt.createQmlObject('import QtQuick 2.15; NumberAnimation { property: "scale"; to: 2.0; duration: 500 }', dynamicAnim);dynamicAnim.addAnimation(anim);
}

SequentialAnimation(序列動畫)

SequentialAnimation按順序依次運行子動畫,適用于需要多個動畫按特定順序執行的場景。

核心屬性
屬性類型描述默認值
animationslist子動畫列表空列表
runningbool是否運行false
loopsint循環次數1
alwaysRunToEndbool停止時是否完成當前動畫false
currentAnimationAnimation當前正在運行的子動畫null
基本示例
import QtQuick 2.15Rectangle {id: rectwidth: 100; height: 100color: "red"x: 0; y: 0SequentialAnimation {running: trueNumberAnimation { target: rect; property: "y"; to: 200; duration: 1000 }ColorAnimation { target: rect; property: "color"; to: "blue"; duration: 500 }RotationAnimation { target: rect; property: "rotation"; to: 360; duration: 800 }}
}
組合動畫序列

可以嵌套ParallelAnimation和SequentialAnimation創建復雜動畫:

SequentialAnimation {// 第一階段:并行移動和旋轉ParallelAnimation {NumberAnimation { property: "x"; to: 200 }RotationAnimation { target: rotation; to: 90 }}// 第二階段:并行改變顏色和大小ParallelAnimation {ColorAnimation { property: "color"; to: "blue" }NumberAnimation { property: "width"; to: 150 }}// 第三階段:暫停后恢復PauseAnimation { duration: 500 }NumberAnimation { property: "scale"; to: 1.0; duration: 300 }
}

注意事項

  1. ?動畫控制?:子動畫的running屬性會被容器動畫控制,不應單獨設置
  2. ?持續時間?:ParallelAnimation的持續時間等于最長子動畫的持續時間
  3. ?性能考慮?:復雜的動畫組合可能需要更多的CPU資源
  4. ?調試技巧?:可以在動畫的running和completed信號中添加console.log跟蹤動畫狀態

ParallelAnimation和SequentialAnimation為QML動畫提供了強大的組合能力,通過它們的嵌套和組合,可以構建出幾乎任何復雜的動畫序列,滿足現代UI對動畫效果的各類需求。

動畫師動畫(Animator)

Animator是Qt Quick 2.2及以上版本引入的一種特殊動畫類型,與常規動畫不同,Animator直接在Qt Quick的場景圖渲染線程中執行,即使在UI線程繁忙時也能保持流暢的動畫效果。

核心優勢

  1. ?獨立于UI線程?:在UI線程阻塞時仍能流暢運行
  2. ?高性能?:直接在渲染線程執行,減少中間步驟
  3. ?專有類型?:針對特定屬性優化的動畫類型
  4. ?簡單易用?:語法與PropertyAnimation類似

Animator類型

QML提供了多種專門的Animator類型:

類型作用屬性描述
XAnimatorx水平位置動畫
YAnimatory垂直位置動畫
ScaleAnimatorscale縮放動畫
RotationAnimatorrotation旋轉動畫
OpacityAnimatoropacity透明度動畫
UniformAnimatoruniform著色器統一變量動畫

基本用法

import QtQuick Rectangle {id: rect1width: 100height: 100x: 10y: 10color: "red"XAnimator on x {from: 10to: 300duration: 2000loops: Animator.Infinite}YAnimator on y {from: 10to: 300duration: 2000loops: Animator.Infinite}ScaleAnimator on scale {from: 0.1to: 1.5duration: 2000loops: Animator.Infinite}OpacityAnimator on opacity {from: 0.1to: 1.0duration: 2000loops: Animator.Infinite}RotationAnimator on rotation {from: 0to: 360duration: 2000loops: Animator.Infinite}}

與PropertyAnimation的對比

特性AnimatorPropertyAnimation
執行線程渲染線程UI線程
UI阻塞時繼續運行可能卡頓
適用版本Qt Quick 2.2+所有版本
性能更高一般
屬性支持特定屬性所有屬性
適用場景高性能需求通用需求

Animator類型特別適合那些需要高性能、流暢動畫的場景,特別是在UI線程可能有繁重任務時,使用Animator可以確保動畫不受影響,保持流暢運行。

精靈動畫(SpriteAnimations)--嵌入式使用較少,了解就好

精靈動畫是游戲開發和交互式應用中常見的技術,通過快速連續顯示一系列圖像幀來創建動畫效果。QML提供了SpriteSequence和Sprite元素來實現精靈動畫。

核心組件

  1. ?SpriteSequence?:精靈動畫的容器,管理多個Sprite動畫
  2. ?Sprite?:定義單個動畫序列
  3. ?AnimatedSprite?:簡化版的單動畫精靈(后面詳細介紹)

SpriteSequence屬性

屬性類型描述默認值
currentSpritestring當前精靈動畫的名稱""
goalSpritestring目標精靈動畫""
interpolatebool是否開啟插值運算true
runningbool是否執行動畫true
spriteslist精靈動畫集合空列表

Sprite屬性

屬性類型描述
namestring動畫名稱
sourceurl精靈圖片源
frameXint起始幀的x坐標
frameYint起始幀的y坐標
frameCountint動畫幀數
frameWidthint單幀寬度
frameHeightint單幀高度
frameDurationint每幀持續時間(ms)
tomap過渡到其他動畫的名稱和權重

基本示例

import QtQuickWindow {width: 640height: 900visible: truetitle: qsTr("Hello World")MouseArea {anchors.fill: parentonClicked: {animation.start()}}SequentialAnimation {id: animation//腳本會在前一個動畫結束后、下一個動畫開始前執行//goalSprite屬性可以指定目標Sprite類型,指定該屬性后會無視過渡權重,而以最短的路徑到達目標動畫。即從still->blink->floating->flailing->falling這個順序播放動畫ScriptAction {script: image.goalSprite = "falling";}NumberAnimation {target: imageproperty: "y"to: 500duration: 12000}// 下降完成之后回到still動畫ScriptAction {script: {image.goalSprite = "";image.jumpTo("still")}}PropertyAction {target: imageproperty: "y"value: 0}}//精靈動畫的容器,管理多個Sprite動畫SpriteSequence {id: imagewidth: 256height: 256anchors.horizontalCenter: parent.horizontalCenterinterpolate: falsegoalSprite: "" //最終動畫// 權重的作用原理?// ?數值含義?:to對象中的鍵值對(如"still":1)表示從當前動畫切換到其他動畫的相對概率。// 例如,"still":1, "blink":0.1表示:// 切換到still動畫的概率是 1/(1+0.1) ≈ 90.9%// 切換到blink動畫的概率是 0.1/(1+0.1) ≈ 9.1%// ?權重為0?:如"floating":0表示禁止切換到該動畫// ?行為表現?:動畫播放時,系統會按權重比例隨機選擇下一狀態,still動畫有極高概率保持,偶爾觸發blink,而不會切換到floating// 靜止Sprite {name: "still"source: "BearSheet.png"frameCount: 1  //幀數frameWidth: 256 //幀的寬度和高度frameHeight: 256frameDuration: 100 //持續時間to: {"still": 1,  //1代表權重"blink": 0.1,"floating": 0}}// 眨眼Sprite {name: "blink"source: "BearSheet.png"frameCount: 3frameX: 256frameY: 1536frameWidth: 256frameHeight: 256frameDuration: 100to: {"still": 1}}// 漂浮Sprite {name: "floating"source: "BearSheet.png"frameCount: 9frameX: 0frameY: 0frameWidth: 256frameHeight: 256frameDuration: 160to: {"still": 0,"flailing": 1}}// 擺動Sprite {name: "flailing"source: "BearSheet.png"frameCount: 8frameX: 0frameY: 768frameWidth: 256frameHeight: 256frameDuration: 160to: {"falling": 1}}// 下降Sprite {name: "falling"source: "BearSheet.png"frameCount: 5frameY: 1280frameWidth: 256frameHeight: 256frameDuration: 160to: {"falling": 1}}}
}

效果:

動畫過渡機制

SpriteSequence中的動畫可以通過to屬性定義狀態轉換:

  1. ?隨機轉換?:根據權重隨機切換到其他動畫
  2. ?強制轉換?:通過設置goalSprite強制切換到指定動畫
  3. ?直接跳轉?:使用jumpTo()方法立即切換到指定動畫

使用場景

  1. 游戲角色動畫(行走、奔跑、跳躍等)
  2. 復雜的狀態轉換動畫
  3. 需要隨機或條件觸發動畫變化的場景
  4. 基于精靈圖的動畫效果

精靈動畫特別適合游戲開發和需要復雜動畫序列的應用,它能夠有效地組織和管理多個動畫狀態,并通過狀態轉換創建豐富的交互體驗。

動態精靈動畫(AnimatedSprite)--嵌入式使用較少,了解就好

AnimatedSprite是QML中用于實現幀動畫的簡化組件,適用于不需要復雜狀態管理的單一動畫序列。

核心屬性

AnimatedSprite的主要屬性如下:

屬性類型描述默認值
frameCountint動畫總幀數1
frameRatereal每秒播放幀數-
frameWidthint單幀圖像寬度元素寬度
frameHeightint單幀圖像高度元素高度
sourceurl精靈圖集路徑必須指定
loopsint循環次數Animation.Infinite
currentFrameint當前幀索引0
frameDurationint每幀持續時間(ms)-
frameSyncbool是否同步顯示刷新率false
interpolatebool是否在幀間插值true
pausedbool是否暫停false
reversebool是否反向播放false
runningbool是否運行true

基本用法

import QtQuick 2.12
import QtQuick.Window 2.12Window {visible: truewidth: 800height: 600color: "black"title: "Qt基于Qml圖像幀動畫播放"AnimatedSprite {id: animatedwidth: 365height: 365anchors.centerIn: parentsource: "qrc:/numbers.png"frameWidth: 64frameHeight: 64frameDuration: 1000 // 每秒播放一幀frameCount: 10frameX: 0frameY: 0onCurrentFrameChanged: {info.text = "%1/%2".arg(animated.currentFrame).arg(animated.frameCount)}}// 控制界面Row {spacing: 20anchors.horizontalCenter: parent.horizontalCenteranchors.bottom: parent.bottomanchors.bottomMargin: 4Text {id: infowidth: 120height: 60color: "red"font.pixelSize: 38verticalAlignment: Text.AlignVCenterhorizontalAlignment: Text.AlignRight}Button {width: 120height: 60text: (animated.paused === true) ? "播放" : "暫停"onClicked: (animated.paused === true) ? animated.resume() : animated.pause()}Button {width: 120height: 60text: "單幀播放"onClicked: animated.advance()}Button {width: 120height: 60text: "重置"onClicked: animated.restart()}}
}

與SpriteSequence的對比

特性AnimatedSpriteSpriteSequence
復雜度簡單復雜
動畫數量單一動畫多動畫序列
狀態轉換不支持支持
性能更高略低
適用場景簡單幀動畫復雜動畫狀態機

?性能優化建議

  1. ?使用精靈圖集?:將多幀打包到一個圖像文件中,減少資源加載開銷
  2. ?合理設置幀率?:根據實際需要設置,避免不必要的渲染
  3. ?適時暫停?:當動畫不可見時暫停播放
  4. ?預加載資源?:提前加載動畫資源,避免運行時卡頓
  5. ?減少插值?:對于像素藝術風格動畫,關閉interpolate屬性

AnimatedSprite因其簡單易用和高效性能,成為實現簡單幀動畫的首選方案,特別適合游戲特效、加載動畫、簡單角色動畫等場景。

彈動效果(Flickable)

Flickable是Qt Quick中用于實現可拖動和彈動效果的元素,它提供了一個可以滾動的區域,用戶可以通過滑動手勢瀏覽超出顯示區域的內容。

核心屬性

Flickable的主要屬性如下:

屬性類型描述默認值
contentWidthreal內容寬度必須指定
contentHeightreal內容高度必須指定
contentXreal當前水平位置0
contentYreal當前垂直位置0
flickableDirectionenum滑動方向(Flickable.AutoFlickDirection等)AutoFlickDirection
boundsBehaviorenum邊界行為(Flickable.StopAtBounds等)StopAtBounds
maximumFlickVelocityreal最大滑動速度(像素/秒)平臺相關
flickDecelerationreal滑動減速度平臺相關
interactivebool是否允許用戶交互true
pixelAlignedbool是否像素對齊false
pressDelayint按下延遲時間(ms)0

基本用法

import QtQuick 2.5
import QtQuick.Window 2.2Window {visible: truewidth: 640height: 480title: qsTr("Flickable Demo")Flickable {id: flickableinteractive: trueanchors.fill: parentcontentWidth: 1000contentHeight: 1000boundsBehavior: Flickable.StopAtBounds// 內容項 - 一個大圖像Image {id: imagesource: "kun.jpg"width: 1000height: 1000}}// 添加滾動條指示ScrollBar {id: vbarwidth: 12height: flickable.heightanchors.right: flickable.rightorientation: Qt.Verticalposition: flickable.visibleArea.yPositionsize : flickable.visibleArea.heightRatioonPositionChanged: {if (active) flickable.contentY = position * (flickable.contentHeight );}}ScrollBar {id: hbarwidth: flickable.widthheight: 12anchors.bottom: flickable.bottomorientation: Qt.Horizontalposition: flickable.visibleArea.xPositionsize : flickable.visibleArea.widthRatioonPositionChanged: {if (active) flickable.contentX = position * (flickable.contentWidth );}}
}

動態內容示例

Flickable常用于顯示動態生成的內容:

Flickable {anchors.fill: parentcontentWidth: col.widthcontentHeight: col.heightColumn {id: colwidth: parent.widthRepeater {model: 50delegate: Rectangle {width: col.widthheight: 60color: index % 2 ? "lightgray" : "white"Text {text: "Item " + indexfont.pixelSize: 20anchors.centerIn: parent}}}}
}

高級用法:自定義回彈效果

Flickable的rebound屬性允許開發者自定義內容回彈到邊界時的過渡動畫效果:

Flickable {width: 200; height: 200contentWidth: 400; contentHeight: 400boundsBehavior: Flickable.DragOverBoundsrebound: Transition {NumberAnimation {properties: "x,y"duration: 1000easing.type: Easing.OutBounce}}Rectangle {width: 400; height: 400gradient: Gradient {GradientStop { position: 0.0; color: "lightsteelblue" }GradientStop { position: 1.0; color: "blue" }}}
}

邊界行為詳解

Flickable提供了多種邊界行為控制方式:

  1. ?StopAtBounds?(默認):內容不能拖動到邊界之外,輕拂也不會超調
  2. ?DragOverBounds?:內容可以拖動到邊界之外,但輕拂不會超調
  3. ?OvershootBounds?:輕拂時可以超過邊界,但不能拖動到邊界之外
  4. ?DragAndOvershootBounds?:內容可以拖動到邊界之外,輕拂時也可以超過邊界

性能優化技巧

  1. ?設置clip屬性?:對于非全屏Flickable,應將clip設為true以避免渲染開銷
  2. ?合理使用pixelAligned?:對于像素精確的內容,啟用pixelAligned可避免亞像素渲染
  3. ?動態加載內容?:對于超長列表,考慮使用動態加載技術
  4. ?避免過度繪制?:優化內容項的繪制邏輯

翻轉效果(Flipable)

Flipable是QML中用于實現3D翻轉效果的元素,可以創建卡片翻轉、面板切換等視覺效果。

核心屬性
屬性類型描述默認值
frontItem正面顯示的項必須指定
backItem背面顯示的項可選
sideenumeration當前顯示的面(Front或Back)Front
transformlist應用的變換列表空列表
axisvector3d旋轉軸(x,y,z)(0,1,0)
anglereal當前旋轉角度(度)0

基本用法

import QtQuickWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Flipable {id: flipablewidth: 240height: 240anchors.centerIn: parentproperty bool flipped: falsedfront: Image {source: "front.png"anchors.centerIn: parent}back: Image {source: "back.png"anchors.centerIn: parent}transform: Rotation {id: rotationorigin.x: flipable.width / 2origin.y: flipable.height / 2axis.x: 0axis.y: 1axis.z: 0angle: 0}states: State {name: "back"when: flipable.flippedPropertyChanges {target: rotationangle: 180}}transitions: Transition {NumberAnimation {target: rotationproperty: "angle"duration: 500}}MouseArea {anchors.fill: parentonClicked: {flipable.flipped = !flipable.flipped}}}
}

?

性能優化建議

  1. ?簡化內容?:Flipable的兩面內容應盡量簡單,避免復雜嵌套
  2. ?合理使用Perspective?:在父元素上設置Perspective變換可增強3D效果
  3. ?避免頻繁切換?:翻轉動畫較耗資源,不宜頻繁觸發
  4. ?預渲染內容?:對于復雜內容,考慮使用ShaderEffect預渲染

總結

QML提供了豐富而強大的動畫系統,從基礎的屬性動畫到復雜的3D效果,開發者可以創建各種流暢的交互體驗。關鍵要點包括:

  1. ?選擇合適的動畫類型?:根據場景選擇PropertyAnimation、Behavior或Animator
  2. ?組合使用動畫?:利用ParallelAnimation和SequentialAnimation創建復雜序列
  3. ?性能優化?:對于頻繁觸發的動畫,優先考慮Animator類型
  4. ?狀態管理?:合理使用State和Transition管理界面狀態變化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/89736.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/89736.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/89736.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LangGraph教程9:LangGraph檢查點和Send機制

文章目錄 檢查點 send機制 檢查點 檢查點是每個超級步驟保存的圖狀態的快照,并由StateSnapshot對象表示,具有以下關鍵屬性: config:與此檢查點相關的配置。 metadata:與此檢查點相關的元數據。 values:此時狀態通道的值。 next:將要在圖中執行的下一個節點名稱的元組。…

面試高頻題 力扣 130. 被圍繞的區域 洪水灌溉(FloodFill) 深度優先遍歷(dfs) 暴力搜索 C++解題思路 每日一題

目錄零、題目描述一、為什么這道題值得你花時間掌握&#xff1f;二、題目拆解&#xff1a;提取核心關鍵點三、解題思路&#xff1a;從邊界入手&#xff0c;反向標記四、算法實現&#xff1a;深度優先遍歷&#xff08;DFS&#xff09; 兩次遍歷五、C代碼實現&#xff1a;一步步拆…

QA:多品牌多架構私有云的數據備份及恢復有哪些最佳實踐?

一、跨平臺備份架構設計?1、統一管理平臺選型選擇支持多品牌接口的備份軟件&#xff0c;通過抽象層適配不同私有云API。例如&#xff0c;備份軟件可同時對接VMware、OpenStack、ZStack等平臺&#xff0c;實現策略集中配置與任務調度。?2、數據抽象與格式標準化采用中間數據層…

LeetCode Hot100 【1.兩數之和、2.兩數相加、3.無重復字符的最長子串】

1. 兩數之和 自己做 分析 解法1&#xff1a;暴力解 class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {int num1 0; //下標int num2 0;vector<int> s; //保存結果for(vector<int>::iterator it1 nums.…

AI一鍵“瘦身”,拯救巨卡無比的圖

有沒有碰到過那種巨卡無比的AI&#xff08;Illustrator&#xff09;文件&#xff1f;從素材網站下的&#xff0c;或者自己“圖像描摹”出來的&#xff0c;上面密密麻麻全是錨點&#xff0c;動一下卡半天&#xff01;我是在海外工作了10年的職業設計師&#xff5e;這些年最大的心…

MySQL基礎教程:SELECT語句詳解

MySQL基礎教程&#xff1a;SELECT語句詳解一、SQL概述1.1 SQL背景知識1.2 SQL語言排行榜1.3 SQL分類二、SQL語言的規則與規范2.1 基本規則2.2 大小寫規范2.3 注釋2.4 命名規則2.5 數據導入三、基本的SELECT語句3.0 最簡單的SELECT3.1 SELECT...FROM3.2 列的別名3.3 去除重復行3…

云原生環境下的安全控制框架設計

在這個容器滿天飛、微服務遍地跑的時代&#xff0c;安全問題就像打地鼠游戲一樣&#xff0c;剛按下一個又冒出三個。今天我們來聊聊如何在云原生環境中構建一套靠譜的安全控制框架。 &#x1f4d6; 文章目錄 引言&#xff1a;云原生時代的安全新挑戰云原生安全面臨的核心挑戰安…

Python關于numpy的基礎知識

一.首先先安裝numpy windowsr 輸入cmd 然后像我這樣輸入進去&#xff0c;加一句后面的https&#xff1a;.....可以放其他他的鏡像地址比如 清華大學鏡像源&#xff1a;Simple Index阿里云鏡像源&#xff1a;Simple Index中國科學技術大學鏡像源&#xff1a;Verifying - USTC …

生成式人工智能實戰 | 自回歸模型詳解與實現

生成式人工智能實戰 | 自回歸模型詳解與實現 0. 前言 1. 文本生成模型分析 2. 數據處理 2.1 數據預處理 2.2 創建訓練數據批次 3. 模型構建與訓練 3.1 構建 LSTM 模型 3.2 訓練 LSTM 模型 4. 生成文本 4.1 通過預測下一個 token 生成文本 4.2 控制文本生成的創意性 0. 前言 本…

路由器SDH POS接口

SDH POS 可看作“用 SDH 光纖專線給路由器當超級寬帶網線”。 1?? 拆名字 SDH?同步數字體系&#xff08;Synchronous Digital Hierarchy&#xff09;&#xff0c;運營商的骨干光傳輸標準&#xff0c;顆粒 STM-1/4/16/64…&#xff08;155 M/622 M/2.5 G/10 G&#xff09;。P…

響應式單位rpx及搭配使用UI產品工具

&#x1f3a8;? 歡迎來到RPX與即時設計的前端探索之旅 &#x1f680;&#x1f4bb; 親愛的開發者朋友們&#xff1a; &#x1f44b; 大家好&#xff01;很高興能在CSDN這個技術分享的平臺上與各位相遇&#xff01;&#x1f31f; 作為一名長期奮戰在前端開發一線的工程師&#…

MC0463四大名著-水滸簽到

碼蹄集OJ-四大名著-水滸簽到 一、題目背景 本問題以《水滸傳》為故事經緯&#xff0c;講述史進對數列數字奧秘的探索。小碼妹向其講解特殊數列求和規則&#xff0c;我們需依據規則&#xff0c;對給定長度 n 的數列&#xff0c;按奇偶分組方式計算奇數組和與偶數組和的運算結果…

前綴和 HASH

前綴和 & HASH 個人模板 560. 和為 K 的子數組 class Solution {public int subarraySum(int[] nums, int k) {// 滑動窗口前綴和int n nums.length;int[] prevSum new int[n 1];for (int i 1; i < n 1; i) {prevSum[i] prevSum[i - 1] nums[i - 1];}int ans …

周末總結(2024/07/19)

工作 人際關系核心實踐&#xff1a; 要學會隨時回應別人的善意&#xff0c;執行時間控制在5分鐘以內 遇到接不住的話題時拉低自己&#xff0c;抬高別人(無陰陽氣息) 朋友圈點贊控制在5min以內&#xff0c;職場社交不要放在5min以外 職場的人際關系在面對利益沖突是直接質疑&am…

若依框架開啟注冊功能全流程指南

在若依&#xff08;RuoYi&#xff09;框架中&#xff0c;用戶注冊功能并非默認開啟&#xff0c;需要通過后端配置、前端調整以及必要的角色分配設置來實現。本文將詳細介紹開啟注冊功能的完整步驟&#xff0c;幫助開發者快速完成配置。一、后端配置&#xff1a;開啟注冊功能開關…

STM32單片機_3

第十章IIC通信協議規定, 起始之后主機必須先發送一個字節: 從機地址讀寫位, 進行尋址然后接收一下應答位, 然后再發送一個字節, 寫入從機寄存器地址 之后就可以進行數據的收發了注意: 在 主機的接收應答的時候, 立刻釋放SDA 然后這時候從機會立刻做出反應, 即拉低SDA, 也就是置…

SpringAI_Chat模型_DeepSeek模型--基礎對話

一、前言 Spring AI 提供跨 AI 供應商&#xff08;如 OpenAI、Hugging Face 等&#xff09;的一致性 API, 通過分裝的ChatModel或ChatClient即可輕松調動LLM進行流式或非流式對話。 本專欄主要圍繞著通過OpenAI方式調用各種大語言模型展開學習&#xff08;因為95%以上模型都…

數據結構:字符串(Strings)

目錄 第一性問題&#xff1a;計算機如何表示文字&#xff1f; ASCII&#xff1a;最早的字符編碼標準&#xff08;美國人寫的&#xff09; Unicode&#xff1a;解決全球語言的編碼方案 字符&#xff08;Character&#xff09; ?編輯 為什么字符常量必須加上單引號 &#…

【vue-5】Vue 3 中的 v-model:雙向數據綁定的全面指南

在 Vue 開發中&#xff0c;v-model 是實現表單輸入和應用狀態之間雙向綁定的關鍵指令。Vue 3 對 v-model 進行了重大改進&#xff0c;使其更加靈活和強大。本文將深入探討 Vue 3 中 v-model 的工作原理、新特性以及最佳實踐。 1. v-model 基礎 1.1 什么是 v-model v-model 是 V…

結合自身,制定一套明確的 Web3 學習路線和技術棧建議

目錄 ? 一、結合自身&#xff0c;明確方向和目的 ? 二、技術路線和建議 &#x1f9ed; 技術路線圖&#xff08;按階段劃分&#xff09; 第一階段&#xff1a;鞏固 Web3 基礎&#xff08;1-2 周&#xff09; 第二階段&#xff1a;NFT 平臺開發實戰&#xff08;4-6 周&…