ChartView与LineSeries搭配实现曲线局部缩放功能

效果图:

上一篇文章实现的时候还不知道有QtChart这个模块......好好看了下资料就想做个例子实现一下这功能,比较了下代码量...恩,直接看代码:

    Rectangle {
        id: view_rect
        anchors.fill: parent
//        anchors.topMargin: 40
        ChartView {
            id: view
            title: "Two Series, Common Axes"
            anchors.fill: parent
            legend.visible: false
            antialiasing: true
            property point hoveredPoint: Qt.point( 0, 0 )
            property bool hovered: false
            ValueAxis {
                id: axisX
                min: 0
                max: 50
                tickCount: 5
            }

            ValueAxis {
                id: axisY
                min: -0.5
                max: 1.5
            }

            LineSeries {
                id: series1
                axisX: axisX
                axisY: axisY
                onHovered: {
//                    view.hoveredPoint = point
//                    view.hovered = state
                }
            }

            MouseArea {
                anchors.fill: parent
                hoverEnabled: true
                onPositionChanged: {
                    var point = Qt.point( 0, 0 )
                    point.x = mouse.x
                    point.y = mouse.y
                    var hoveredPoint = view.mapToValue( point, series1 )
                    if( hoveredPoint.x >= 0 && hoveredPoint.x <= 50 ) {
                        view.hovered = true
                        view.hoveredPoint = hoveredPoint
                    } else {
                        view.hovered = false
                    }
                }

                onWheel: {
                    if( view.hovered ) {
                        if( wheel.angleDelta.y > 0 ) {
                            if( axisX.max - axisX.min <= 2 ) {
                                return
                            }
                            view.zoomIn( view.hoveredPoint )
                        } else {
                            view.zoomOut( view.hoveredPoint )
                            if( axisX.min <= 0 ) {
                                axisX.min = 0
                            }
                            if( axisX.max >= 50 ) {
                                axisX.max = 50
                            }
                        }
                    }
                }
            }

            function zoomIn( hoveredPoint ) {
                if( hoveredPoint.x - axisX.min <= 1 ) {
                    return
                }
                var scale = parseFloat( ( hoveredPoint.x - axisX.min ) / ( axisX.max - axisX.min ) )
                axisX.min++
                axisX.max = ( hoveredPoint.x - axisX.min ) / scale + axisX.min
            }

            function zoomOut( hoveredPoint ) {
                var scale = parseFloat( ( hoveredPoint.x - axisX.min ) / ( axisX.max - axisX.min ) )
                axisX.min--
                axisX.max = ( hoveredPoint.x - axisX.min ) / scale + axisX.min
            }
        }

        // Add data dynamically to the series
        Component.onCompleted: {
            for (var i = 0; i <= 50; i++) {
                series1.append(i, Math.random());
            }
        }
    }

实现该功能最关键在于获取鼠标位置对应的坐标值, ChartView提供一个方法mapToValue,指明一个point与series,就可获得这个point对应series的坐标值。现在通过一个覆盖整个ChartView的MouseArea获取mouse,转换成point,当鼠标在坐标轴内移动时,就可记录到hoveredPoint内。

放大功能我写在zoomIn函数内,这里每次放大的值只是将最小值+1,可自己调整。注意一点的是hoverPoint.x是不能小于axisX.min的,所以我在放大前做了判断;

缩小功能我写在zoomOut函数内,这边是想让曲线饱满的覆盖在整个坐标内,所以对两个极端做了判断,超出范围就将边界值赋值给它;

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Unity是一款专业的游戏开发引擎,但也可以用来实现窗口拖拽缩放功能。在Unity中,可以使用RectTransform组件来控制界面元素的位置和大小。接下来,我将介绍一种简单的方法来实现窗口的拖拽和缩放功能。 首先,在Unity中创建一个UI界面,并添加一个Image组件作为窗口的背景。然后,给窗口的Image组件添加一个拖拽脚本和一个缩放脚本。 拖拽脚本的作用是控制窗口的拖拽功能。在脚本中,我们可以通过监听鼠标按下、鼠标拖动和鼠标放开的事件来实现窗口的拖拽。具体步骤如下: 1. 在脚本中定义一个bool类型的变量,用于判断是否可以进行拖拽操作。 2. 在Update函数中,通过Input.GetMouseButtonDown和Input.GetMouseButtonUp函数判断鼠标是否按下或放开。如果鼠标按下,将上述bool变量设置为true,如果鼠标放开,将bool变量设置为false。 3. 还需要判断鼠标是否在窗口的范围内。可以使用RectTransform组件的rect属性获取窗口的矩形区域,然后使用RectTransformUtility类的ScreenPointToLocalPointInRectangle函数判断鼠标的位置是否在窗口的范围内。 4. 如果鼠标在窗口范围内并且bool变量为true,可以通过RectTransform组件的anchoredPosition属性来设置窗口的位置。 缩放脚本的作用是实现窗口的缩放功能。在脚本中,我们可以通过鼠标滚轮的输入来控制窗口的缩放。具体步骤如下: 1. 在脚本中定义一个float类型的变量,用于控制窗口的缩放比例。 2. 在Update函数中,通过Input.GetAxis函数来获取鼠标滚轮的输入值。 3. 根据鼠标滚轮的输入值来增加或减少窗口的缩放比例。可以使用RectTransform组件的sizeDelta属性来设置窗口的大小。 通过上述步骤,我们可以实现Unity中窗口的拖拽和缩放功能。这样用户就可以通过鼠标来拖动窗口并调整窗口的大小,提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值