QML做图片倒影效果(控件倒影)

前言

用 QML 做图片倒影,主要是用ShaderEffect组件来实现,先来看看实际效果,如下:


还可以用同样的方式来做其他控件的倒影,例如:

正文

直接来看源码

import QtQuick 2.0
import QtQuick.Controls 1.4

Rectangle {
    id: window

    width: 600
    height: 500

    gradient: Gradient {
        GradientStop { position: 0; color: "lightsteelblue" }
        GradientStop { position: 1; color: "black" }
    }

    Image {
        id: img
        width: 300
        height: 170
        source: "car.png"
        anchors.centerIn: parent
    }

    ShaderEffect {
        anchors.top: img.bottom
        width: img.width
        height: img.height
        anchors.left: img.left

        property variant source: img
        property size sourceSize: Qt.size(0.5 / img.width, 0.5 / img.height)

        fragmentShader: "
            varying highp vec2 qt_TexCoord0;
            uniform lowp sampler2D source;
            uniform lowp vec2 sourceSize;
            uniform lowp float qt_Opacity;
            void main() {

                lowp vec2 tc = qt_TexCoord0 * vec2(1, -1) + vec2(0, 1);
                lowp vec4 col = 0.25 * (texture2D(source, tc + sourceSize)
                                        + texture2D(source, tc- sourceSize)
                                        + texture2D(source, tc + sourceSize * vec2(1, -1))
                                        + texture2D(source, tc + sourceSize * vec2(-1, 1))
                                       );
                gl_FragColor = col * qt_Opacity * (1.0 - qt_TexCoord0.y) * 0.2;
            }"
    }
}

若要拓展做其他控件的倒影,只需要修改property variant source: img 对象即可.

还有一种比较简单的容易理解的方式来实现同样的效果

import QtQuick 2.0
import QtQuick.Controls 1.4

Rectangle {
    id: window

    width: 600
    height: 500

    gradient: Gradient {
        GradientStop { position: 0; color: "lightsteelblue" }
        GradientStop { position: 1; color: "black" }
    }

    Image {
        id: img
        width: 300
        height: 170
        source: "car.png"
        anchors.centerIn: parent
    }
    Item{
            width: img.width
            height: img.height

            Image{
                source: img.source
                anchors.fill: parent
                transform: Scale{
                    yScale: -1
                    origin.y:img.height/2.
                }
            }
            LinearGradient{
                width: img.width
                height: img.height
                gradient: Gradient{
                    GradientStop{position: 0.0;color:Qt.rgba(0,0,0,0.1)}
                    GradientStop{position: 0.4;color:Qt.rgba(0,0,0,1)}
                }
            }
        }
}

原理是先通过设置一张倒着的图片,然后在图片上添加一个渐变层,代码很简单,不再赘述。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luoyayun361

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值