1.PC&Android适用同样的移动代码

首先PC端的点击事件在Android端也同样适用,所以我们可以不用再写一次移动的代码。然后因为Android端是通过手指位置和数量进行判断的,如果直接使用PC端的移动代码会有些小bug。所以我们在结合两者使用的时候需要对移动操作的代码加以限制,让只用一根手指触碰的时候才会触发移动的代码,如果出现两根或多根手指则肯定是在Android设备上运行,此时放大缩小就只能使用Android特定的代码了。

2.通用代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;public class MapControl : MonoBehaviour, IPointerEnterHandler, IPointerDownHandler, IDragHandler, IPointerUpHandler
{private Vector3 targetScreen;// 目标物体的屏幕空间坐标  private Vector3 targetWorld;// 目标物体的世界空间坐标  private Transform target;// 目标物体的空间变换组件  private Vector3 mouseScreen;// 鼠标的屏幕空间坐标  private Vector3 start;//初始位置private Vector3 dragStartPos;//拖拽前位置private RectTransform canvas;//得到canvas的ugui坐标private RectTransform imgRect;//得到图片的ugui坐标Vector2 offset = new Vector3();//用来得到鼠标和图片的差值float maxX, maxY, minX, minY;public static bool isExitMap=true;private Vector2 oldPosition1;private Vector2 oldPosition2;void Awake(){target = transform;start = transform.localPosition;canvas = GameObject.Find("Canvas").GetComponent<RectTransform>();imgRect = GetComponent<RectTransform>();dragStartPos = transform.localPosition;}private void Update(){ScrollWheelControl();AndroidScrollWheelControl();}void ScrollWheelControl()//鼠标滑轮滚动控制物体大小{if (isExitMap) return;float scaleOffset = Input.GetAxis("Mouse ScrollWheel");if ((transform.localScale.x + scaleOffset) <= 3 && (transform.localScale.x + scaleOffset) >= 1){transform.localScale = new Vector3(transform.localScale.x + scaleOffset, transform.localScale.y + scaleOffset, transform.localScale.z + scaleOffset);maxX = 950 * (transform.localScale.x - 1);maxY = 500 * (transform.localScale.x - 1);minX = -950 * (transform.localScale.x - 1);minY = -500 * (transform.localScale.x - 1);if ((transform.localScale.x - 1) == 0){maxX =20;maxY =20;minX =-20;minY =-20;}if (scaleOffset < 0)//缩放的时候逐渐返回原点(防止缩放后视界停留在最大视界外){transform.localPosition = Vector3.MoveTowards(transform.localPosition, start, 100f);}}}void AndroidScrollWheelControl(){if (Input.anyKey){if (Input.touchCount >1){if (Input.GetTouch(0).phase == TouchPhase.Moved && Input.GetTouch(1).phase == TouchPhase.Moved){Vector2 tempPosition1 = Input.GetTouch(0).position;Vector2 tempPosition2 = Input.GetTouch(1).position;if (isEnlarge(oldPosition1, oldPosition2, tempPosition1, tempPosition2)){float oldScale = transform.localScale.x;float newScale = oldScale +0.1f;transform.localScale = new Vector3(newScale, newScale, newScale);}else{float oldScale = transform.localScale.x;float newScale = oldScale -0.1f;transform.localScale = new Vector3(newScale, newScale, newScale);transform.localPosition = Vector3.MoveTowards(transform.localPosition, start, 100f);}//备份上一次触摸点的位置,用于对比   oldPosition1 = tempPosition1;oldPosition2 = tempPosition2;}if (transform.localScale.x >= 3)transform.localScale = new Vector3(3, 3, 3);if (transform.localScale.x <= 1)transform.localScale = new Vector3(1, 1, 1);}}}bool isEnlarge(Vector2 oP1, Vector2 oP2, Vector2 nP1, Vector2 nP2){//函数传入上一次触摸两点的位置与本次触摸两点的位置计算出用户的手势   var leng1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));var leng2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));if (leng1 < leng2)return true;//放大手势elsereturn false;//缩小手势}public void OnPointerEnter(PointerEventData eventData){if (Input.anyKey && Input.touchCount > 1)return;isExitMap = false;}void IPointerDownHandler.OnPointerDown(PointerEventData eventData){if (Input.anyKey && Input.touchCount > 1)return;Vector2 mouseDown = eventData.position;    //记录鼠标按下时的屏幕坐标Vector2 mouseUguiPos = new Vector2();   //定义一个接收返回的ugui坐标bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDown, eventData.enterEventCamera, out mouseUguiPos);if (isRect)   //如果在{//计算图片中心和鼠标点的差值offset = imgRect.anchoredPosition - mouseUguiPos;}}void IDragHandler.OnDrag(PointerEventData eventData){if (Input.anyKey && Input.touchCount > 1)return;dragStartPos = transform.localPosition;Vector2 mouseDrag = eventData.position;   //当鼠标拖动时的屏幕坐标Vector2 uguiPos = new Vector2();   //用来接收转换后的拖动坐标//和上面类似bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, eventData.enterEventCamera, out uguiPos);if (isRect){//设置图片的ugui坐标与鼠标的ugui坐标保持不变imgRect.anchoredPosition = offset + uguiPos;LimitArea();}}void IPointerUpHandler.OnPointerUp(PointerEventData eventData){if (Input.anyKey && Input.touchCount > 1)return;offset = Vector2.zero;if(transform.localScale.x==1)imgRect.localPosition = new Vector3(0, 0, imgRect.localPosition.z);}void LimitPos()//根据ui顶点的屏幕坐标限制拖动范围,不受pivot影响(严格限制){//左下,左上,右上,右下——以屏幕左下为原点gameObject.GetComponent<RectTransform>().GetWorldCorners(corners);if (corners[0].x > (Screen.width / 2))transform.localPosition = dragStartPos;if (corners[0].y > (Screen.height / 2))transform.localPosition = dragStartPos;if (corners[2].x < (Screen.width / 2))transform.localPosition = dragStartPos;if (corners[2].y < (Screen.height / 2))transform.localPosition = dragStartPos;}void LimitPos1()//根据ui顶点的屏幕坐标限制拖动范围,不受pivot影响(果冻效果,放在updata里运行){if (isDraging)return;//左下,左上,右上,右下——以屏幕左下为原点gameObject.GetComponent<RectTransform>().GetWorldCorners(corners);if (corners[0].x > (Screen.width / 2))transform.localPosition = new Vector2(transform.localPosition.x - (corners[0].x - (Screen.width/2)), transform.localPosition.y);if (corners[0].y > (Screen.height / 2))transform.localPosition = new Vector2(transform.localPosition.x, transform.localPosition.y-(corners[0].y - (Screen.height / 2)));if (corners[2].x < (Screen.width / 2))transform.localPosition = new Vector2(transform.localPosition.x - (corners[2].x - (Screen.width / 2)), transform.localPosition.y);if (corners[2].y < (Screen.height / 2))transform.localPosition = new Vector2(transform.localPosition.x, transform.localPosition.y-(corners[2].y - (Screen.height / 2)));}
}

PCAndroid通用移动、放大、缩小相关推荐

  1. android 图片放大缩小_贴在手机上的显微镜,轻松放大400倍,化身“蚁人”玩转微观世界...

    记得在漫威电影<蚁人>里,男猪脚只要穿上那套黑科技制服,按下开关,"咻"的一声就缩到蚂蚁大小,并操控蚂蚁.昆虫和自己并肩作战!!简直不要太酷! 蚁人"进入微观 ...

  2. CSS动画效果无限循环放大缩小

    效果图: CSS动画效果无限循环放大缩小 <image class="anima" mode="widthFix" @click="nav&qu ...

  3. HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等

    http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...

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

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

  5. SVG 基本知识:SVG 放大缩小之 viewbox 初探 (1)

    最近做了一个关于SVG的应用的技术分享网站svgtrick.com,会同步一些文章到这里来,更多的可以去网站看看. 接触过SVG都知道,SVG有自己的一套坐标视窗系统,理解它对于在SVG的使用,特别是 ...

  6. ai里为什么不能随意放大缩小_平面设计基础知识:平面设计师应该熟练掌握的软件之AI。...

    今天给大家整理了一下,平面设计基础知识中平面设计师应该熟练掌握的软件之AI.这个系列共有五篇,其他几篇都在首页,可以去看一下,有任何问题可以提出来,下面我们一起看一下平面设计基础知识中平面设计师应该熟 ...

  7. 放大缩小html文字,jquery放大缩小文字

    jquery放大缩小文字 $(function(){ $("span").click(function(){ var theSize = $("#title") ...

  8. css3 animation(左右摆动) (放大缩小)

    左右摆动: @-webkit-keyframes roundRule{0%, 100%{-webkit-transform: rotate(-15deg);}50%{-webkit-transform ...

  9. 【插件】jQuery.iviewer----图片浏览(滚动放大缩小问题解决)

    [插件]jQuery.iviewer----图片浏览(滚动放大缩小问题解决) 参考文章: (1)[插件]jQuery.iviewer----图片浏览(滚动放大缩小问题解决) (2)https://ww ...

最新文章

  1. IDEA 小技巧之书签与收藏
  2. 危险工种 机器人逃生记_袋料自动搬运机器人为什么能取代人工搬运
  3. linux修改密码和宽限天数,Linux chage用法详解:修改用户密码状态
  4. 计算机科学与技术联合培养是什么意思,联合培养
  5. Sublime Text 3搭建前端环境
  6. 请求的安全信息不可用或无法显示
  7. 在Python中将字符串拆分为字符数组
  8. 2019-05-27 Java学习日记 day17
  9. 热乎的宇宙条总部面经,已拿offer,速来围观
  10. 女程序员也会有35岁的危机焦虑吗?
  11. .net的辅助工具列表
  12. Meson构建系统(一)
  13. 【C语言基础】-九条语句
  14. 元宇宙持续火爆,各地纷纷布局元宇宙
  15. 前端面试题总结(js、html、小程序、React、ES6、Vue、算法、全栈热门视频资源)持续更新
  16. libusb,libusbk,winusb的区别
  17. nova-compute
  18. Unix/Linux下的Curses库开发指南——第一章 Curses库开发简介
  19. 【机器学习】训练集、验证集与测试集
  20. Arch Linux遇到的坑(下)

热门文章

  1. Web颜色对照表大全
  2. Oracle SQL手册
  3. Android RingtoneManager铃声管理
  4. STM32F0系列内部高速时钟的配置方法
  5. 矢量控制(从源头上说得很透)
  6. 2016太原UI设计师告你去公司我们涉猎哪些工作?
  7. 软件测试的目的是什么
  8. 开发,从需求出发 · 之一 所见即所得
  9. php批量添加水印图片,php 批量给图片加水印代码_PHP教程
  10. 全球自动驾驶仿真平台盘点