QML中的MacOS dock-like组件

Kie*_*n E 1 macos qt dock qml qt-quick

使用QtQuick,我在转发器中有一排5个图像.我想在悬停时实现一个类似于MacOS停靠动画的动画.这是一张参考图片:

MacOS Dock

为了进一步分解,这就是我想要实现的目标.这些图像在悬停时应如下:

  • 悬停的图像扩大
  • 相邻图像会扩大,但会略微减少
  • 图像在扩展时不重叠

这是我到目前为止的代码

  Row {
    spacing: 2
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 30
    anchors.horizontalCenter: parent.horizontalCenter

    Repeater {
      id: iconRepeater
      model: iconColors()
      Image {
        source: "icons/" + modelData + ".png"
        scale: mouseArea.containsMouse ? 1.5 : 1.0
        MouseArea {
          id: mouseArea
          anchors.fill: parent
          hoverEnabled: true
          onClicked: endTimer()
        }
        Behavior on scale {
          PropertyAnimation {
            duration: 75
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

这会扩展您悬停的图像,但我似乎也无法影响邻居.任何建议表示赞赏!

dte*_*ech 6

我建议使用更强大的解决方案,您可以控制缩放因子以及影响的传播和衰减:

在此输入图像描述

  Column {
    Slider {
      id: foff
      from: 1
      to: 5
      stepSize: 1
      value: 2
      snapMode: Slider.SnapAlways
    }
    Slider {
      id: sf
      from: 0.5
      to: 2.5
      stepSize: 0.5
      value: 0.5
      snapMode: Slider.SnapAlways
    }
    Slider {
      id: dmp
      from: 1
      to: 5
      stepSize: 1
      value: 1
      snapMode: Slider.SnapAlways
    }
  }

  Row {
    id: row
    anchors.bottom: parent.bottom
    anchors.bottomMargin: 30
    anchors.horizontalCenter: parent.horizontalCenter

    property int falloff: foff.value // how many adjacent elements are affected
    property int current: -1
    property real scaleFactor: sf.value // that's how much extra it scales
    property real damp: dmp.value // decay of influence 

    Repeater {
      id: iconRepeater
      model: 10
      Rectangle {
        width: 50 * pseudoScale
        height: width
        anchors.bottom: parent.bottom
        color: "red"
        border.color: "black"
        property real pseudoScale: {
          if (row.current == -1) return 1
          else {
            var diff = Math.abs(index - row.current)
            diff = Math.max(0, row.falloff - diff)
            var damp = row.falloff - Math.max(1, diff)
            var sc = row.scaleFactor
            if (damp) sc /= damp * row.damp
            diff = diff / row.falloff * sc + 1
            return diff
          }
        }
        MouseArea {
          id: mouseArea
          anchors.fill: parent
          hoverEnabled: true
          onContainsMouseChanged: row.current = containsMouse ? index : -1
        }
        Behavior on pseudoScale {
          PropertyAnimation {
            duration: 150
          }
        }
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我建议不要在行上使用间距,因为这样会在可能起作用的物品之间产生死区.而是将一个空的"Item"作为每个委托的根,然后将图像放在内部,稍微小一些,以创建视觉间隙,而不会产生鼠标输入间隙. (2认同)