ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

qml 定时器以及几种简单动画

2022-05-30 10:02:54  阅读:192  来源: 互联网

标签:动画 定时器 height width qml id rect


Timer

定时器,以指定的时间间隔触发处理程序。

属性

interval: int

设置触发器之间的时间间隔(以毫秒为单位)。默认间隔为1000毫秒。

repeat: bool

定时器是否重复触发,值为true,则按照时间间隔重复触发;为false,则在指定时间间隔触发一次后就停止(即running被置位false)。

running: bool

为true时,启动定时器,否则停止定时器。默认为false。

triggeredOnStart: bool

启动定时器时,通常是在指定时间间隔之后才会第一次触发,有时候希望能在启动定时器时立即触发。如果值为true,则在定时器启动时立即触发处理程序,并随后按照指定是时间间隔触发。

注意:如果repeat设置为false,则定时器将触发两次,一次是启动,然后时间间隔后一次。

信号

triggered()

定时器触发的信号。

注意对应的处理程序是onTriggered。

方法

restart()

重新启动定时器。

如果定时器未运行,则启动该定时器;如果定时器正则运行,则会先停止定时器,然后马上又启动。

   Item {

        visible: true

        width: 500

        height: 300

        Timer {

            id:timer

            interval: 500  //设置定时器定时时间为500ms,默认1000ms

            running: true  //是否开启定时,默认是false,当为true的时候,进入此界面就开始定时

            repeat: true   //是否重复定时,默认为false

            onTriggered: time.text = Date().toString() //定时触发槽,定时完成一次就进入一次

        }

 

        Text {

            id: time

            font.pixelSize: 20

            verticalAlignment: Text.AlignVCenter

            anchors.top: parent.top

            anchors.horizontalCenter: parent.horizontalCenter

            anchors.topMargin: 200

        }

        MouseArea{

            anchors.fill: parent

            onClicked: timer.stop(); //开启定时器

            onDoubleClicked: timer.start();

        }

    }

Animation

在qml中, Animation是所有动画类的基类,其中有一个属性应该注意,那就是alwaysRunToEnd.它默认为false,如果设置了true,那么无论你是调用了Animation的stop()或者设置running属性为false,动画都会从头到尾的执行完毕。

一些常⽤的动画:

PropertyAnimation(属性动画)- 使⽤属性值改变播放的动画

Rectangle{
        id: rootItem
        width: 360
        height: 240
        color: "#EEEEEE"
 
        Rectangle{
            id: rect
            width: 50
            height: 150
            anchors.centerIn: parent
            color: "blue"
 
            PropertyAnimation{
                id: animation
                target: rect
                property:  "width"
                //  改变多个属性可以用properties来设置,不过to属性设置的值会将应用你设置的多个属性,因此,用这种方法时,最后设置同一类的属性。比如高度和宽度
                //  propeties: "width, height"  //属性名之间用英文逗号个离开
                //  针对单一目标不仅如此,同时可以通过targets设置同时对多个目标的操作:targets: [rectA, rectB]
                to: 220
                duration: 2000
            }
 
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    animation.running = true
                }
            }
            //要同时改变多个属性,但是又不是同一类的
            //Animation on <property>将一个PropertyAnimation与一个属性关联起来
                        MouseArea{
                            anchors.fill: parent
                            id: mouseArea
                        }
 
                        PropertyAnimation on width{
                            target: rect
                            to: 150
                            duration: 1000
                            running: mouseArea.pressed  //如果不设置此属性,那么在Item加载完后就会立即执行
                        }
        }

}

 

   // 增加信号控制属性动画
/*
    Rectangle{
    id: rootItem
    width: 360
    height: 240
    color: "#EEEEEE"
 
    Rectangle{
        id: rect
        width: 50
        height: 150
        anchors.centerIn: parent
        color: "blue"
 
        property var animation
        PropertyAnimation{
            id: toSquare
            target: rect
            property: "width"
            to: 150
            duration: 4000
            onStarted: {
                rect.animation = toSquare
                rect.color = "red"
            }
 
            onStopped: {
                rect.color = "blue"
            }
        }
 
        PropertyAnimation{
            id: toRect
            target: rect
            properties: "width"
            to: 50
            duration: 4000
            onStarted: {
                rect.animation = toRect
                rect.color = "red"
            }
 
            onStopped: {
                rect.color = "blue"
            }
        }
 
        MouseArea{
            anchors.fill: parent
            onClicked: {
                if(rect.animation == toRect ||
                   rect.animation == undefined)
                {
                    toSquare.start()
                }
                else
                    toRect.start()
            }
        }
    }
}

*/

NumberAnimation(数字动画)- 使⽤数字改变播放的动画

    Rectangle {
        id:win
        visible: true
        width: 600
        height: 300
        Rectangle{
            y:win.height/2
            id:source
            width: 100
            height: 100
            color: "red"
        }
        NumberAnimation {
            id:xChange
            target: source
            to:win.width-source.width
            property: "x"
            duration: 5000
            easing.type: Easing.InOutQuad
        }
        NumberAnimation {
            id:rotationChange
            target: source
            to:360*5
            property: "rotation"
            duration: 5000
            easing.type: Easing.InOutQuad
        }
        NumberAnimation {
            id:radiusChange
            target: source
            to:100
            property: "radius"
            duration: 5000
            easing.type: Easing.InOutQuad
        }
        MouseArea{
            anchors.fill: parent
            onClicked:{
                xChange.start()
                rotationChange.start()
                radiusChange.start()
            }
 

      

ColorAnimation(颜⾊动画)- 使⽤颜⾊改变播放的动画

    //颜色动画渐变
    Item {
            id: container
            width:200
            height:200
 
            Rectangle {
                 id: gradientRect;
                 width:80
                 height: 80
                 gradient: Gradient {
                     GradientStop { position: 0; color: "red" }
                     GradientStop { position: 1; color: "steelblue" }
                 }
                 visible: false
                 layer.enabled: true;
                 layer.smooth: true
             }
 
            Text {
                id: text
                anchors.centerIn: parent
                color: "pink"
                text: "Hello world!"
                font.pixelSize: 32
                layer.samplerName: "maskSource"
                layer.enabled: true
                     layer.effect: ShaderEffect {
                         property var colorSource: gradientRect;
                         fragmentShader: "
                                   uniform lowp sampler2D colorSource;
                                   uniform lowp sampler2D maskSource;
                                   uniform lowp float qt_Opacity;
                                   varying highp vec2 qt_TexCoord0;
                                   void main() {
                                       gl_FragColor =
                                           texture2D(colorSource, qt_TexCoord0)
                                           * texture2D(maskSource, qt_TexCoord0).a
                                           * qt_Opacity;
                                   }
                               "
                     }
 
 
 
                SequentialAnimation on font.letterSpacing {
                    loops: Animation.Infinite;
                    NumberAnimation { from: 0; to: 50; easing.type: Easing.InQuad; duration: 3000 }
                    ScriptAction {
                        script: {
                            container.y = (screen.height / 4) + (Math.random() * screen.height / 2)
                            container.x = (screen.width / 4) + (Math.random() * screen.width / 2)
                        }
                    }
                }
 
                SequentialAnimation on opacity {
                    loops: Animation.Infinite;
                    NumberAnimation { from: 1; to: 0; duration: 2600 }
                    PauseAnimation { duration: 400 }
                }
            }

        }

RotationAnimation(旋转动画)- 使⽤旋转改变播放的动画

Rectangle
    {
        id:colorChanged
        color: "green"
        width: 200
        height: 200
        radius: 30
        anchors.centerIn: parent
       // transformOrigin: item.right
 
    }
    RotationAnimation
    {
        id:rotationAnimation
        target: colorChanged
        to:900
        direction: rotationAnimation.Clockwise
        duration: 3000
 
    }
    MouseArea
    {
        anchors.fill: parent
        onClicked: rotationAnimation.start()

    }

除了上⾯这些基本和通常使⽤的动画元素,QtQuick还提供了⼀些特殊场景下 使⽤的动画:

PauseAnimation(停⽌动画)- 运⾏暂停⼀个动画

SequentialAnimation(顺序动画)- 允许动画有序播放

ParallelAnimation(并⾏动画)- 允许动画同时播放

AnchorAnimation(锚定动画)- 使⽤锚定改变播放的动画

parentAnimation(⽗元素动画)- 使⽤⽗对象改变播放的动画 SmotthedAnimation(平滑动画)- 跟踪⼀个平滑值播放的动画 SpringAnimation(弹簧动画)- 跟踪⼀个弹簧变换的值播放的动画 PathAnimation(路径动画)- 跟踪⼀个元素对象的路径的动画 Vector3dAnimation(3D容器动画)- 使⽤QVector3d值改变播放的动画PropertyAction(属性动作)- 在播放动画时改变属性

ScriptAction(脚本动作)- 在播放动画时运⾏脚本

 

标签:动画,定时器,height,width,qml,id,rect
来源: https://www.cnblogs.com/lllion/p/16325792.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有