Hi.
How can I create CircularReveal [1] in Qml?
I tried using both OpacityMask and ShaderEffect, but with no luck.
Using CircularReveal2, transition is not circle but an ellipse, because
width and height of Item are not equal.
Using CircularReveal3, OpacityMask is anchored in Item and quality of item
is improved over time.

Thanks

[1] : https://github.com/ozodrukh/CircularReveal/
import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Rectangle {
        anchors.fill: parent
        color: "#55a"
    }

    CircularReveal2 {
        id: cr2
        width: 500
        height: 100
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.verticalCenter

        Button {
            text: "Click me"
            anchors.fill: parent
        }
    }

    CircularReveal3 {
        id: cr3
        width: 500
        height: 100
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.top: parent.verticalCenter

        Button {
            text: "Click me"
            anchors.fill: parent
        }
    }
}










import QtQuick 2.0

ShaderEffect {
    id: shader
    
    property variant source
    property real centerX: 0.5 // [0,1]
    property real centerY: 0.5 // [0,1]
    
    property bool forward: true
    property real smoothness: 0.1
    property real progress: 0.0

    Component.onCompleted: doForward()
    
    function doForward() {
        forwardAnimation.start()
    }
    
    function doBackward() {
        backwardAnimation.start()
    }
    
    NumberAnimation {
        id: forwardAnimation
        target: shader
        property: "progress"
        duration: 5000
        from: 0
        to: 1
//        running: false
    }
    
    NumberAnimation {
        id: backwardAnimation
        target: shader
        property: "progress"
        duration: 5000
        from: 1
        to: 0
//        running: false
    }
    
    fragmentShader:
        "
varying highp vec2 qt_TexCoord0;
uniform sampler2D source;
uniform lowp float qt_Opacity;

uniform highp float centerX;
uniform highp float centerY;
uniform float smoothness;
uniform bool forward;
uniform float progress;

const float SQRT_2 = 1.414213562373;

void main() {
    vec2 center = vec2(centerX, centerY);

    float x = forward ? progress : 1.-progress;
    gl_FragColor = distance(qt_TexCoord0, center) < progress ?
                        texture2D(source, qt_TexCoord0) :
                        vec4(0, 0, 0, 0);

//    float x = forward ? progress : 1.-progress;
//    float m = smoothstep(-smoothness, 0.0, SQRT_2*distance(center, qt_TexCoord0) - x*(1.+smoothness));
//    gl_FragColor = mix(vec4(0, 0, 0, 0), texture2D(source, qt_TexCoord0), forward ? 1.-m : m) * qt_Opacity;
}
            "
}


















import QtQuick 2.0
import QtQuick.Controls 1.4
import QtGraphicalEffects 1.0

Item {
    id: root

    Component.onCompleted: {
        mask.width = mask.height = hypot(root.width, root.height)
    }

    function hypot(x, y) {
        return Math.sqrt(x*x + y*y)
    }

    function startAnimation() {
        // TODO start reveal animation
    }

    function resetAnimation() {
        // TODO reverse reveal animation
    }
    Rectangle {
        id: mask
        visible: false
        x: (root.width - mask.width) / 2
        y: (root.height - mask.height) / 2
        radius: width

        Behavior on width {
            NumberAnimation { duration: 5000 }
        }
        Behavior on height {
            NumberAnimation { duration: 5000 }
        }
    }


    layer.enabled: true
    layer.effect: OpacityMask {
        maskSource: mask
    }
}
import QtQuick 2.0

Item {
    id: root

    function hypot(x, y) {
        return Math.sqrt(x*x + y*y)
    }

    function startAnimation() {
        // TODO start reveal animation
    }

    function resetAnimation() {
        // TODO reverse reveal animation
    }

    layer.enabled: true
    layer.effect: CircularShader { }
}



















_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to