Stories

Detail Return Return

Qml 中實現毛玻璃效果 - Stories Detail

【寫在前面】

毛玻璃效果(Acrylic Effect)是一種常見的 UI 設計風格,它通過模糊背景並添加透明度和噪聲效果,使界面元素看起來像是半透明的磨砂玻璃。

本文將介紹如何使用 Qml 實現這種效果,並提供一個完整的示例代碼。


【正文開始】

1. 效果圖

Acrylic.png

2. 毛玻璃效果的實現原理

毛玻璃效果的核心是通過模糊背景圖像,併疊加透明度和噪聲效果來實現。

具體來説,實現毛玻璃效果的步驟如下:

  1. 捕獲背景圖像:首先需要捕獲背景圖像,作為模糊效果的輸入。
  2. 模糊處理:對捕獲的背景圖像進行模糊處理,生成模糊效果。
  3. 添加亮度和色調:通過疊加一個半透明的矩形,調整模糊區域的亮度和色調。
  4. 添加噪聲效果:在模糊區域上疊加噪聲圖像,增加磨砂玻璃的質感。

3. 實現毛玻璃效果

DelAcrylic.qml 文件定義了一個自定義的 Qml 組件,用於實現毛玻璃效果。以下是該文件的主要部分:

  • ShaderEffectSource: 用於捕獲源項(sourceItem)的內容,並將其作為模糊效果的輸入。sourceRect 屬性定義了捕獲的區域。
ShaderEffectSource {
    id: __source
    anchors.fill: parent
    visible: false
    sourceRect: Qt.rect(control.x, control.y, control.width, control.height)
}
  • FastBlur: 對 ShaderEffectSource 的內容進行模糊處理。radius 屬性控制模糊的強度。
FastBlur {
    id: __fastBlur
    anchors.fill: parent
    source: __source
    radius: 32
}
  • Rectangle: 有兩個矩形,第一個矩形用於設置背景的亮度(luminosity),第二個矩形用於設置顏色的色調(colorTint)和透明度(opacityTint)。
Rectangle {
    anchors.fill: parent
    color: Qt.rgba(1, 1, 1, luminosity)
    radius: control.radiusBg
}

Rectangle {
    anchors.fill: parent
    color: Qt.rgba(colorTint.r, colorTint.g, colorTint.b, opacityTint)
    radius: control.radiusBg
}
  • Image: 用於添加噪聲效果,噪聲圖像通過 base64 編碼嵌入到 Qml 文件中。opacity 屬性控制噪聲的透明度。
Image {
    id: __noiseImage
    anchors.fill: parent
    source: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAGHaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8P3hwYWNrZXQgYmVnaW49J++7vycgaWQ9J1c1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCc/Pg0KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyI+PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnRpZmY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vdGlmZi8xLjAvIj48dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCjw/eHBhY2tldCBlbmQ9J3cnPz4slJgLAAAMNElEQVRYR02XW1NTd9vGf0nYZEFMVha7JBAIYYihEQVSUQQVtOrUtipVsTPtTOs38KDtUQ+Y6ZfoTI88aT3o2Jk6bUfa4QFEKZWIsgm7ECKQHZu1FpiQQAx5DnyfzHv6n//Jvbl+13Vrvv/++5zRaOSPP/7giy++wGQyMTw8TCgUoquri2QySSgUorm5mcbGRh4/fozT6cTtdvPgwQMMBgPnzp0DYHR0FEmSiEag=="
    fillMode: Image.Tile
    opacity: 0.02
}

4. 如何使用

main.qml 是示例文件,使用 DelAcrylic 組件並提供了交互式的滑塊來控制模糊效果的參數。

以下是該文件的主要部分:

  • Window: 定義了一個窗口,寬度為 750,高度為 500,標題為 "Acrylic Test"。
Window {
    width: 750
    height: 500
    visible: true
    title: qsTr("Acrylic Test")
}
  • Image: 作為背景圖像,填充整個窗口。
Image {
    id: bg
    anchors.fill: parent
    source: "qrc:/img.jpg"
}
  • DelAcrylic: 使用 DelAcrylic 組件,將其放置在窗口的中心位置,並綁定背景圖像作為模糊效果的源項。opacityNoiseopacityTintradiusBlur 屬性分別綁定到三個滑塊的值。
DelAcrylic {
    id: acrylic
    x: (bg.width - width) * 0.5
    y: (bg.height - height) * 0.5
    width: 300
    height: 300
    sourceItem: bg
    opacityNoise: slider1.value
    opacityTint: slider2.value
    radiusBlur: slider3.value

    MouseArea {
        anchors.fill: parent
        drag.target: parent
    }
}
  • Column: 包含三個滑塊,分別用於控制 opacityNoiseopacityTintradiusBlur 屬性。
Column {
    Slider {
        id: slider1
        anchors.horizontalCenter: parent.horizontalCenter
        from: 0
        to: 1
        stepSize: 0.01
        value: 0.02
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(2)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("opacityNoise")
        }
    }

    Slider {
        id: slider2
        anchors.horizontalCenter: parent.horizontalCenter
        from: 0
        to: 1
        stepSize: 0.01
        value: 0
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(2)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("opacityTint")
        }
    }

    Slider {
        id: slider3
        from: 0
        to: 100
        value: 48
        ToolTip.visible: hovered
        ToolTip.text: value.toFixed(0)

        Text {
            anchors.left: parent.right
            anchors.leftMargin: 10
            anchors.verticalCenter: parent.verticalCenter
            text: qsTr("radiusBlur")
        }
    }
}

【結語】

通過 DelAcrylic.qmlmain.qml 文件,我們實現了一個具有毛玻璃效果的 Qml 應用程序。DelAcrylic 組件通過模糊背景圖像、添加亮度和色調、以及疊加噪聲效果,實現了毛玻璃效果。

這種毛玻璃效果可以廣泛應用於現代 UI 設計中,特別是在需要模糊背景或實現類似 Acrylic 效果的場景中。通過調整模糊強度、透明度和噪聲效果,我們可以創建出豐富多樣的視覺效果,提升用户體驗。

改進建議:

  • 性能優化:模糊效果可能會對性能產生影響,特別是在高分辨率或複雜場景下。可以考慮優化模糊算法或降低模糊的強度以提高性能。
  • 更多參數控制:可以添加更多的參數控制,例如噪聲的類型、模糊的方向等,以提供更豐富的視覺效果。

最後:項目鏈接(多多star呀..⭐_⭐):

Github: https://github.com/mengps/QmlControls

Gitee: https://gitee.com/MenPenS/QmlControls

user avatar manshenjiroudeyezi_dquxb Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.