地图放大缩小,以两指中间的点为锚点

  1. 地图放大缩小,以两指中间的点为锚点 
  2. 该代码使用插件Easy Touch ,DoTween
using DG.Tweening;
using UnityEngine;
using HedgehogTeam.EasyTouch;

public class MapFixedPointZoom  : MonoBehaviour
{
    public float MaxScale = 1.5f;
    public float MinScale = 1f;
    public RectTransform Map;
    public RectTransform Canvas;
    public RectTransform People;
    public void OnEnable()
    {
        EasyTouch.On_Pinch += On_Pinch;
        //EasyTouch.On_Drag += On_Drag;
    }

    public void OnDestroy()
    {
        EasyTouch.On_Pinch -= On_Pinch;
        //EasyTouch.On_Drag -= On_Drag;
    }


    private void On_Drag(Gesture gesture)
    {
        XYLimit();
    }

    public void OnDrap()
    {
        XYLimit();
    }

    public void Tap()
    {
        var pos = ScreenPos2MapPos(Input.mousePosition);
        People.DOLocalMove(pos, 0.5f);
    }

    private void On_Pinch(Gesture gesture)
    {
        FixedPointZoom(gesture.deltaPinch * gesture.deltaTime * 0.2f, gesture.position);
    }

    private void FixedPointZoom(float scaleChangeValue, Vector2 screenPos)
    {
        float delX = screenPos.x - Map.position.x;
        float delY = screenPos.y - Map.position.y;

        float scaleX = delX / Map.rect.width / Map.localScale.x;
        float scaleY = delY / Map.rect.height / Map.localScale.y;

        Map.localScale = new Vector2(Mathf.Clamp(Map.localScale.x + scaleChangeValue, MinScale, MaxScale),
            Mathf.Clamp(Map.localScale.y + scaleChangeValue, MinScale, MaxScale));

        Map.pivot += new Vector2(scaleX, scaleY);
        Map.position += new Vector3(delX, delY, 0);
        XYLimit();
    }
    private void XYLimit()
    {
        var minX = Map.sizeDelta.x * Map.localScale.x * (Map.pivot.x - 1) + Canvas.sizeDelta.x;
        var maxX = Map.sizeDelta.x * Map.localScale.x * Map.pivot.x;
        var x = Mathf.Clamp(Map.localPosition.x, minX, maxX);
        var minY = Map.sizeDelta.y * Map.localScale.y * (Map.pivot.y - 1);
        var maxY = Map.sizeDelta.y * Map.localScale.y * Map.pivot.y - Canvas.sizeDelta.y;
        var y = Mathf.Clamp(Map.localPosition.y, minY, maxY);
        Map.localPosition = new Vector3(x, y, 0);
    }

    private Vector2 ScreenPos2MapPos(Vector2 screenPos)
    {
        //父类的pivot影响子类的 不用处理
        var x = (-Map.localPosition.x + screenPos.x) / Map.localScale.x;
        var y = -(Canvas.sizeDelta.y - screenPos.y + Map.localPosition.y) / Map.localScale.y;
        return new Vector2(x, y);
    }
}

 

QGraphicsView是Qt框架中的一个用于显示和编辑图形项的组件。要实现图片放大缩小、鼠标拖动以及以鼠标为中心进行放大缩小,可以通过以下步骤来完成: 首先,创建一个QGraphicsView对象,并设置其场景(QGraphicsScene)为包含图片的场景。可以通过QPixmap或QImage加载图片,并将其设置为场景的背景。 接下来,设置QGraphicsView的一些属性,以支持放大缩小和鼠标拖动。可以通过设置setDragMode()来启用鼠标拖动功能,如setDragMode(QGraphicsView::ScrollHandDrag)。 为了实现放大缩小功能,可以注册QGraphicsView的鼠标滚轮事件,并根据滚轮的方向来调整缩放级别。当检测到鼠标滚轮事件时,可以调用scale()函数来实现放大缩小。可以根据鼠标的位置来设置缩放的中心,可以使用mapToScene()函数将鼠标位置转换为场景坐标。 为了实现以鼠标为中心的放大缩小,可以在接收到鼠标滚轮事件时,先将鼠标的位置保存下来。然后,通过调用setTransformationAnchor()函数将变换锚点设置为鼠标,然后再进行缩放操作。 最后,可以根据需要添加其他功能,例如限制缩放范围、添加手势支持等。 通过以上步骤,就可以实现使用QGraphicsView来实现图片放大缩小、鼠标拖动以及以鼠标为中心进行放大缩小的功能。具体实现代码可以参考Qt官方文档和相关示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值