using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class PictureZoom : MonoBehaviour
{
    #region Zoom

/// <summary>
    /// 上一帧两指间距离
    /// </summary>
    private float lastDistance = 0;

/// <summary>
    /// 当前两个手指之间的距离
    /// </summary>
    private float twoTouchDistance = 0;

/// <summary>
    /// 得到图片
    /// </summary>
    public RectTransform image;

/// <summary>
    /// 第一根手指按下的坐标
    /// </summary>
    Vector2 firstTouch = Vector3.zero;

/// <summary>
    /// 第二根手指按下的坐标
    /// </summary>
    Vector2 secondTouch = Vector3.zero;
    /// <summary>
    /// 是否有两只手指按下
    /// </summary>
    private bool isTwoTouch = false;
    [SerializeField, Header("缩放")]
    float minExtend = 0.5f;
    [SerializeField, Header("扩大")]
    float maxExtend = 10.0f;
    #endregion

#region Move

// 鼠标起点
    private Vector2 originalLocalPointerPosition;
    // 面板起点  
    private Vector3 originalPanelLocalPosition;
    // 当前面板  
    [SerializeField]
    private RectTransform panelRectTransform;
    // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小
    [SerializeField]
    private RectTransform parentRectTransform;
    private static int siblingIndex = 0;

#endregion

[SerializeField,Header("UI Camera,需要将Canves Render Mode 设置为 ScreenSpace-Camera")]
    Camera pressEventCamera;
    [SerializeField]
    Image images;
    [SerializeField]
    bool isScrollWheel=false;
    [SerializeField]
    private float mouseExtendScale = 0.0f;
    [SerializeField, Header("鼠标缩放计算")]
    bool scrollScaleCal = false;
    [SerializeField,Range(1,10)]
    int scaleFactor = 3;

void Awake()
    {
        panelRectTransform = transform.parent as RectTransform;
        parentRectTransform = panelRectTransform.parent as RectTransform;
    }

// Use this for initialization
    void Start()
    {
    }

private void LateUpdate()
    {
#if UNITY_EDITOR || UNITY_STANDALONE_WIN
        MouseExtend();
#elif UNITY_IOS || UNITY_ANDROID
        TouchExtend();
#endif
    }

void MouseExtend()
    {

if (isScrollWheel)
        {
            float scrollValue = Input.GetAxis("Mouse ScrollWheel");

if (scrollValue < 0)
            {
                if (mouseExtendScale > 0)
                {
                    mouseExtendScale = 0;
                }
                mouseExtendScale += scrollValue* scaleFactor;
                scrollScaleCal = true;
                Debug.Log("Zoom Out:\t" + mouseExtendScale);
            }
            //-Zoom In-//
            if (scrollValue > 0)
            {
                if (mouseExtendScale < 0)
                {
                    mouseExtendScale = 0;
                }

mouseExtendScale += scrollValue* scaleFactor;
                scrollScaleCal = true;
                
                Debug.Log("Zoom In:\t" + scrollValue);
            }

PictureScale();
        }

if (Input.GetMouseButtonDown(0))
        {
            Vector2 mousePostion = Input.mousePosition;
            OnPointerDown(mousePostion, pressEventCamera);
        }

else if (Input.GetMouseButton(0))
        {
            Vector2 mousePostion = Input.mousePosition;
            OnDrag(mousePostion, pressEventCamera);
        }

}

/// <summary>
    /// 触摸屏放大缩小
    /// </summary>
    void TouchExtend()
    {
        //如果有两个及以上的手指按下
        if (Input.touchCount > 1)
        {
            //当第二根手指按下的时候
            if (Input.GetTouch(1).phase == TouchPhase.Began)
            {
                isTwoTouch = true;
                //获取第一根手指的位置
                firstTouch = Input.touches[0].position;
                //获取第二根手指的位置
                secondTouch = Input.touches[1].position;

lastDistance = Vector2.Distance(firstTouch, secondTouch);
            }

//如果有两根手指按下
            if (isTwoTouch)
            {
                //每一帧都得到两个手指的坐标以及距离
                firstTouch = Input.touches[0].position;
                secondTouch = Input.touches[1].position;

twoTouchDistance = Vector2.Distance(firstTouch, secondTouch);

//当前图片的缩放
                Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
                //两根手指上一帧和这帧之间的距离差
                //因为100个像素代表单位1,把距离差除以100看缩放几倍
                float changeScaleDistance = (twoTouchDistance - lastDistance) / 100;
                //因为缩放 Scale 是一个Vector3,所以这个代表缩放的Vector3的值就是缩放的倍数
                Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
                //图片的缩放等于当前的缩放加上 修改的缩放
                image.localScale = curImageScale + changeScale;
                //控制缩放级别
                image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, minExtend, maxExtend), Mathf.Clamp(image.localScale.y, minExtend, maxExtend), 1);
                //这一帧结束后,当前的距离就会变成上一帧的距离了
                lastDistance = twoTouchDistance;
            }

//当第二根手指结束时(抬起)
            if (Input.GetTouch(1).phase == TouchPhase.Ended)
            {
                isTwoTouch = false;
                firstTouch = Vector3.zero;
                secondTouch = Vector3.zero;
            }
        }
        else if (Input.touchCount == 1)
        {
            Vector2 pos = Input.GetTouch(0).position;

if (Input.GetTouch(0).phase == TouchPhase.Began)
            {
                if (images)
                {
                    images.color = Color.green;
                }
                OnPointerDown(pos, pressEventCamera);
            }
            else if (Input.GetTouch(0).phase == TouchPhase.Moved)
            {
                if (images)
                {
                    images.color = Color.yellow;
                }
                OnDrag(pos, pressEventCamera);
            }
        }
    }
    /// <summary>
    /// 图片缩放核心脚本 Windows 平台放大缩小
    /// </summary>
    /// <param name="scaleDistance">缩放距离</param>
    private void PictureScale()
    {
        if (scrollScaleCal)
        {
            //当前图片的缩放
            Vector3 curImageScale = new Vector3(image.localScale.x, image.localScale.y, 1);
            //两根手指上一帧和这帧之间的距离差
            //因为100个像素代表单位1,把距离差除以100看缩放几倍
            float changeScaleDistance = mouseExtendScale / 100;
            //因为缩放 Scale 是一个Vector3,所以这个代表缩放的Vector3的值就是缩放的倍数
            Vector3 changeScale = new Vector3(changeScaleDistance, changeScaleDistance, 0);
            //图片的缩放等于当前的缩放加上 修改的缩放
            image.localScale = curImageScale + changeScale;
            //控制缩放级别
            image.localScale = new Vector3(Mathf.Clamp(image.localScale.x, minExtend, maxExtend), Mathf.Clamp(image.localScale.y, minExtend, maxExtend), 1);

scrollScaleCal = false;

}

}

/// <summary>
    /// 鼠标、手指摁下获取的位置
    /// </summary>
    /// <param name="position"></param>
    /// <param name="pressEventCamera"></param>
    public void OnPointerDown(Vector2 position, Camera pressEventCamera)
    {
        siblingIndex++;
        panelRectTransform.transform.SetSiblingIndex(siblingIndex);

originalPanelLocalPosition = panelRectTransform.localPosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, position, pressEventCamera, out originalLocalPointerPosition);
    }
    /// <summary>
    /// 拖拽功能
    /// </summary>
    /// <param name="position"></param>
    /// <param name="pressEventCamera"></param>
    public void OnDrag(Vector2 position, Camera pressEventCamera)
    {
        if (panelRectTransform == null || parentRectTransform == null)
            return;

Vector2 localPointerPosition;

if (RectTransformUtility.ScreenPointToLocalPointInRectangle(parentRectTransform, position, pressEventCamera, out localPointerPosition))
        {
            Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
            panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
        }

ClampToWindow();
    }

/// <summary>
    /// Clamp panel to area of parent
    /// </summary>
    void ClampToWindow()
    {
        Vector3 pos = panelRectTransform.localPosition;

Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
        Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;

pos.x = Mathf.Clamp(panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);
        pos.y = Mathf.Clamp(panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);

panelRectTransform.localPosition = pos;
    }

}

Unity3D 放大缩小图片相关推荐

  1. Android多点触摸交互处理,放大缩小图片

    多点触摸(MultiTouch),指的是允许计算机用户同时通过多个手指来控制图形界面的一种技术.与多点触摸技术相对应的就是单点触摸,单点触摸的设备已经有很多年了,小尺寸的有触摸式的手机,大尺寸的最常见 ...

  2. JavaFX鼠标滚动放大缩小图片

    一.鼠标滚动放大缩小图片 package cn.util;import java.io.File; import javafx.application.Application; import java ...

  3. android+放大缩小图片+有jar嘛,Android相册支持点击放大图片,滑动切换图片,手势放大缩小...

    [实例简介] 项目使用了开源框架Universal-Image-Loader 显示本地图库所有照片 点击放大,单击退出 双击放大缩小 支持左右滑动查看图片 支持手势放大缩小图片 [实例截图] [核心代 ...

  4. Jquery鼠标滚轮放大缩小图片

    使用Jquery鼠标点击图片,划动鼠标滚轮放大缩小图片. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  5. 鼠标滚轮放大/缩小图片

    <img id=pic src=" http://community.csdn.net/images/CSDN_logo.GIF" width=105 height=31 b ...

  6. jquery---实现滚轮放大缩小图片

    (1)滚轮控制放大缩小图片效果如图: 实现代码如下: <!DOCTYPE html> <html><head><meta charset="utf- ...

  7. 鼠标滚轮 放大缩小图片

    js实现鼠标滚轮放大缩小图片 <script>     //放大缩小图片     function   sdZoom(o)   {     var zoom=parseInt(o.styl ...

  8. Markdown给图片添加超链接,点击图片后,跳转新页面。放大缩小图片。

    公司用Markdown写了个项目说明 有个需求,就是点击图片,跳转到图片的链接(因为markdown不能放大缩小图片) 下面是超链接用法: ![alt属性文本](图片地址 ''图片title'') a ...

  9. html 移动端缩小显示图片,Vue移动端可放大缩小图片vue-photo-preview

    效果 与本文无关样式已马赛克 点击图片后: 可通过手指来放大缩小查看图片 使用插件 一.安装 npm install vue-photo-preview --save 二.引用 在view.vue中的 ...

最新文章

  1. ios alertview 链接_iOS-MobLink集成流程
  2. SkFlattenable /Registrar/
  3. 如何关注掘金的所有小伙伴
  4. linux——shell 中常用的控制语句 for、while、if、case、expect、exit、break、continue
  5. windows电脑制作mac os u盘重装系统_图文演示u盘重装系统步骤
  6. 自助分析_为什么自助服务分析真的不是一回事
  7. android update sdk --no-ui,CircleCI Android constraintLayout不起作用
  8. Kafka系列之-Kafka监控工具KafkaOffsetMonitor配置及使用
  9. 社区团购如今进行得如火如荼
  10. [论文阅读] Learning a Unified Classifier Incrementally via Rebalancing
  11. 计算机管理文件和文件夹的实验结果及分析,实验1:文件和文件夹的管理
  12. 鸿蒙升级最佳时间,鸿蒙升级时间确定,17款华为优先,荣耀或成遗珠!
  13. JavaScript判断数组中是否有重复元素方法
  14. 【NoteBook】莫瑞亚(Ash Maurya):精益创业实战(一、二部分)
  15. 例如ASLR和KASLR。还有CPU特性,例如SMAP、SMEP、NX和PXN。
  16. 小红书 x DorisDB:实现数据服务平台统一化,简化数据链路,提升高并发极速查询能力...
  17. PHP接入谷歌验证器(Google Authenticator)
  18. day16re模块和面向对象
  19. VM Workstation 16 Pro 下载安装以及下载配置Linux虚拟机(操作如下)
  20. c语言航空订票系统程序设计,航空订票系统C语言版.doc

热门文章

  1. 无需下载软件,有手就能做的线上个人简历
  2. python中turtle库基本函数
  3. 用python绘制熊猫图案_在python中绘制熊猫系列的CDF
  4. 大话赛宁云 | 训系列-如何构建网络空间的“练兵场”
  5. WaWa的奇妙冒险(第一周集训自闭现场)
  6. Linux放行单个8080端口和放行8000-9000端口区间
  7. hexo+gitHub 个人博客搭建及更换主题历程(特适合入门小白)
  8. bootstrap 常用class
  9. 点击按钮随机更换页面背景颜色
  10. 关于浏览器的几个高度和宽度