Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题

有的时候,我们希望通过直接设置RectTransform的值来进行UI的调整(例如anchoredPosition),但是由于CanvasScaler的缩放,屏幕坐标和Canvas内的坐标并不是一一对应的,存在一个缩放关系。当想直接设置时,需要弄清楚CanvasScaler的缩放原理,找到坐标之间的对应关系。

有关CanvasScaler的介绍,可以参阅官方文档:

https://docs.unity.cn/cn/2019.4/Manual/script-CanvasScaler.html

对于CanvasScaler的理解,可以认为:CanvasScaler的缩放是UI物体不变,画布的大小在变化(实际上也是这样,在缩小屏幕后,Canvas的RectTransform.rect会变大)。CanvasScaler的Match Width Or Height模式中,画布是根据当前屏幕大小和Reference Resolution设置的值进行比较,根据Match中的值来计算实际缩放因子。缩放因子可以通过如下代码计算:

float ScaleFactor => Screen.width / canvasScaler.referenceResolution.x * (1 - canvasScaler.matchWidthOrHeight) + Screen.height / canvasScaler.referenceResolution.y * canvasScaler.matchWidthOrHeight;

含义是:Canvas内的UI被缩放成原来的UI乘以ScaleFactor的大小。
那么,当我们想通过anchoredPosition设置UI的值时,就需要将屏幕坐标除以ScalerFactor,就能计算出UI在画布内的实际坐标。
测试场景:
创建Canvas,将CanvasScaler的ScreenMatchMode设置为MatchWidthOrHeight。

创建Image,设置RectTransform为锚点模式,并且将锚点设置在左下角。(为了直观与屏幕坐标对应,屏幕坐标的左下角为(0,0))

为Image创建脚本,完整代码:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;public class UIDragger : MonoBehaviour,IDragHandler
{public Canvas canvas;public CanvasScaler canvasScaler;public RectTransform rectTransform;//Image的RectTransformprivate float ScaleFactor => Screen.width / canvasScaler.referenceResolution.x * (1 - canvasScaler.matchWidthOrHeight) + Screen.height / canvasScaler.referenceResolution.y * canvasScaler.matchWidthOrHeight;public void OnDrag(PointerEventData eventData){rectTransform.anchoredPosition = eventData.position / ScaleFactor;   }
}

设置好引用后,开始场景,可以看到无论CanvasScaler的Match值设置成什么,都可以正常拖拽。

如果没有经过缩放因子的修正,效果是这样的:

rectTransform.anchoredPosition = eventData.position;


后半段展示了关掉CanvasScaler的效果,实际上这个时候屏幕坐标就和画布坐标一一对应了。

Unity 有关CanvasScaler缩放后的Canvas坐标和Screen坐标问题相关推荐

  1. 目标检测:已经标注的图片缩放后,对标注数据的处理

    在标注数据时,会出现数据已经标注完成,但是图片需要进行缩放,缩放后,原始标注数据不能使用,需要对图片进行重新标注,本文使用Python代码对缩放后的图片的标注数据进行等比例处理,使得标注数据满足缩放后 ...

  2. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移...

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  3. 文本框固定任意一顶点后,拖动相对点任意旋转缩放,计算缩放后顶点坐标

    问题描述 鼠标拖动缩放文本框的时候,需要重新计算缩放后文本框四个顶点的坐标,然后重新绘制新文本框 在Office上,缩放文本框的操作一般是鼠标拖动八个控制点其中一个,然后固定住与其相对的控制点的位置, ...

  4. cad图形不见了怎么办_CAD全图缩放后图纸不见了或者变成了小点怎么办

    CAD全图缩放后图纸不见了或者变成了小点怎么办 一.问题现象: 1.CAD双击鼠标中键(全图缩放)后图纸突然不见了. 保存图纸后图纸的大小没有变,但无论如何缩放都看不到图形. 2.图形变成一个小点,鼠 ...

  5. 关于像素PNG图片在游戏引擎缩放后出现毛边的解决方案

    欢迎参与讨论,转载请注明出处. 本文转载自https://musoucrow.github.io/2017/05/01/png_stroke_problem/ 今日遇到了一个很值得记录的问题:对于像素 ...

  6. android layout后还原位置,Android图片框架photoview如何记住所有状态并还原,包括缩放度,缩放后的移动的距离等等...

    Android图片框架photoview如何记住状态并还原,包括缩放度,缩放后的移动的距离等等,尝试了好多方法都没有作用. private void generateImages() { for (i ...

  7. Winform中实现ZedGraph滚轮缩放后自动重新加载数据

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  8. vc2010+openCV1.0实现将指定目录下的所有jpg文件缩放后存放到目标文件夹

    开发环境:winXP + vc2010 + OpenCV1.0 OpenCV1.0安装目录: D:\opensource\opencv1.0 源代码: /*功能:将指定目录下的所有JPG文件进行缩放后 ...

  9. 物体非等比缩放后的法线处理

    物体非等比缩放后的法线处理 物体经过非等比缩放时,法线不能直接乘上形变矩阵,因为: 因为我们法线始终和物体表面切向量正交,所以有: 当我们通过某个矩阵M变换表面上的点时,变换点处的新切向量t'为Mt. ...

  10. android缩放动画后,Android ObjectAnimator:缩放后动画填充

    我使用ObjectAnimator对scaleX和scaleY动画有问题.Android ObjectAnimator:缩放后动画填充 在动画结束时,Drawable内部被调整大小,但不是ImageV ...

最新文章

  1. C++实现大数的加法
  2. UA MATH571A 多元线性回归V 自相关与非线性模型简介
  3. php的两种复合数据类型是什么意思_2.4PHP复合数据类型:数组和对象
  4. java linkedhashset_java之LinkedHashSet
  5. draw graph
  6. C++学习之路 | PTA乙级—— 1015 德才论 (25分)(精简)
  7. 【数据结构】进击的二叉查找树
  8. Leetcode 颜色分类
  9. java使用pdfbox将图片转换成pdf
  10. 2.10 lnmp架构_慢查询 MySQL路由器 MHA高可用
  11. Linux DRM(一)Display Server
  12. 网页中打开word文档
  13. 全面解读Moby和LinuxKit,Docker称沟通不善招致误解
  14. MD5加密(MD5Util )
  15. Linux4.19-获取IDT地址
  16. 登陆验证成功后的跳转页面依然保留用户信息
  17. 卫片图斑_推进土地卫片图斑整治工作
  18. 正则表达式匹配:包含且不包含
  19. 【PTA题目】7-4 打折 (5 分)
  20. C++的边边角角扫盲

热门文章

  1. QOS端口限速EMAIL流量限速
  2. 接口邮件发送平台,定时发送邮件信息
  3. UG二次开发GRIP修改颜色
  4. 我的Java和Android之路------菜冬瓜
  5. 王之泰201771010131《面向对象程序设计(java)》第七周学习总结
  6. ce变速注入dll失败_调用CE变速DLL注入的软件含HOOK模块
  7. Vue基础学习笔记Day05_生命周期_axios
  8. 使用Python与Sharepoint进行交互——第1部分
  9. 2015腾讯校园招聘软件测试部分笔试题
  10. 计算机中的文档地址怎么填写,电脑中我的文档属性中没有位置选项如何修改存储位置...