Unity 滚动视图(ScrollRect)使某个元素在可视范围内(滚动到某个元素)

在使用UGUI制作滚动视图的过程中,可能会遇到需求说,要定位到其中的某个元素,把它显示在Viewport可视范围内,这要怎么做呢?话不多说,上代码:

namespace ZetanStudio.Extension
{public static class ScrollRectExtension{public static void EnsureVisibility(this ScrollRect scrollRect, RectTransform rectTransform, float? border = null){//角的顺序//1 2//0 3getBothCorners(out var ccorners/*Content的四个角*/, out var corners/*目标的四个角*/);if (ccorners[0] == corners[0] && ccorners[1] == corners[1] && ccorners[2] == corners[2] && ccorners[3] == corners[3]) return;//矩形和拖拽部分一样大,则什么也不做scrollRect.StopMovement();var vcorners = scrollRect.viewport.GetWorldCorners();//Viewport的四个角if (corners[0].y < vcorners[0].y)//如果下边被挡住了,要上移{scrollRect.content.position += new Vector3(0, vcorners[0].y - corners[0].y);getBothCorners(out ccorners, out corners);if (corners[0].y < ccorners[0].y)//如果下边超出了拖拽范围,要往上回移超出的距离{scrollRect.content.position += new Vector3(0, -(ccorners[0].y - corners[0].y));getCorners(out corners);}}if (corners[2].x > vcorners[2].x)//如果右边被挡住了,要左移{scrollRect.content.position += new Vector3(-(corners[2].x - vcorners[2].x), 0);getBothCorners(out ccorners, out corners);if (corners[2].x > ccorners[2].x)//如果右边超出了拖拽范围,要往右回移超出的距离{scrollRect.content.position += new Vector3((corners[2].x - ccorners[2].x), 0);getCorners(out corners);}}if (corners[1].y > vcorners[1].y)//如果上边被挡住了,要下移{scrollRect.content.position += new Vector3(0, -(corners[1].y - vcorners[1].y));getBothCorners(out ccorners, out corners);if (corners[1].y > ccorners[1].y)//如果上边超出了拖拽范围,要往下回移超出的距离{scrollRect.content.position += new Vector3(0, corners[1].y - ccorners[1].y);getCorners(out corners);}}if (corners[0].x < vcorners[0].x)//如果左边被挡住了,要右移{scrollRect.content.position += new Vector3(vcorners[0].x - corners[0].x, 0);getBothCorners(out ccorners, out corners);if (corners[0].x < ccorners[0].x)//如果左边超出了拖拽范围,要往左回移超出的距离scrollRect.content.position += new Vector3(-(ccorners[0].x - corners[0].x), 0);}void getBothCorners(out Vector3[] ccorners, out Vector3[] corners){ccorners = scrollRect.content.GetWorldCorners();getCorners(out corners);}void getCorners(out Vector3[] corners){corners = rectTransform.GetWorldCorners();if (border.HasValue){corners[0] = new Vector3(corners[0].x - border.Value, corners[0].y - border.Value);corners[1] = new Vector3(corners[1].x - border.Value, corners[1].y + border.Value);corners[2] = new Vector3(corners[2].x + border.Value, corners[2].y + border.Value);corners[3] = new Vector3(corners[3].x + border.Value, corners[3].y - border.Value);}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git仓库使用

git仓库是会限制空间大小限制的 git网络库的容量限制_github仓库大小限制-CSDN博客 git是用于管理github的工具 电脑左下角搜索git打开GitBash.exe 进入到要下载到本地的目录 下载到本地的文件不要更改&#xff01; 如果要使用请务必把文件复制到别的空间去再在这个别的空间…

spring_Mybatis模板

maven依赖&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><dependency><groupId>mysql…

论文阅读记录--关于水文系统的传递函数

文章目录 J-schuite的文章,地下水系统的响应的功率谱分析--传递函数1. 什么是冲激响应函数与传递函数?2. 地下水流系统中传递函数的求解3. J-schuite文章中传递函数的复现J-schuite的文章,地下水系统的响应的功率谱分析–传递函数 1. 什么是冲激响应函数与传递函数? 在信号…

记录:卡尔曼滤波推导

参考&#xff1a;古月居-卡尔曼滤波 一、高斯分布&#xff08;Gaussian Distribution&#xff09; 一维高斯分布&#xff1a;随机变量 X X X服从数学期望 μ \mu μ、方差 σ 2 \sigma^2 σ2的正态分布&#xff0c;概率密度函数为 p ( x ) p(x) p(x)。 X ∼ N ( μ , σ 2 )…

前言:为什么学习鸿蒙设备开发

HarmonyOS 是什么&#xff1f;众所周知&#xff0c;HarmonyOS 鸿蒙操作系统是由华为研发的一款面向未来、面向全场景的分布式操作系统&#xff0c;它旨在为各种设备提供统一的操作系统解决方案&#xff0c;从智能手机、平板电脑到智能穿戴设备、智能家居、汽车等各类终端设备都…

Go语言数值类型教程

Go语言提供了丰富的数值类型&#xff0c;包括整数类型、浮点类型和复数类型。每种类型都有其特定的用途和存储范围。下面将详细介绍这些类型&#xff0c;并附带示例代码。 原文链接&#xff1a; Go语言数值类型教程 - 红客网-网络安全与渗透技术 1. 整数类型 原文链接&#xf…

字符画生成网站 ascii字符画

_____ / ___/__ ___ / /__/ _ \/ _ \ \___/ .__/ .__//_/ /_/ font推荐&#xff1a;1.Slant 2.Small 3.Small slant https://patorjk.com/software/taag/#pdisplay&fSmall%20Slant&tCpp https://www.kammerl.de/ascii/AsciiSignature.php https://asciia…

MySQL索引设计遵循一系列原则

高频查询与大数据量表&#xff1a;对查询频次较高且数据量较大的表建立索引。这是因为索引主要是为了加速查询过程&#xff0c;对于经常需要访问的表和数据&#xff0c;索引的效果最为显著。 选择合适索引字段&#xff1a;从WHERE子句中提取最佳候选列作为索引字段&#xff0c…

社交媒体数据恢复:华为畅连

尊敬的用户您好&#xff0c;以下是关于社交软件华为畅连的聊天记录数据恢复教程。在华为手机中&#xff0c;我们可以通过华为云服务和第三方软件来恢复删除的聊天记录。以下是详细的步骤&#xff1a; 第一步&#xff1a;登录华为云服务 请在您的华为手机上找到并打开“云服务”…

网络编程:服务器模型-并发服务器-多进程

并发服务器概念&#xff1a; 并发服务器同一时刻可以处理多个客户机的请求 设计思路&#xff1a; 并发服务器是在循环服务器基础上优化过来的 &#xff08;1&#xff09;每连接一个客户机&#xff0c;服务器立马创建子进程或者子线程来跟新的客户机通信 &#xff08;accept之后…

SpringBoot报空指针错:java.lang.NullPointerException

虽然报空指针错误的原因可能有很多种&#xff0c;但是我还是写上我的报错原因&#xff0c;以此与各位共勉~ 在这里提前说一句&#xff0c;AI虽然强大&#xff0c;但是还是要谨慎使用啊(血的教训)~ 这里先截图我错误的地方&#xff1a; 前端能成功传进来值&#xff0c;后台控制…

图像质量评价指标:了解图像质量的度量方式

图像质量评价指标&#xff1a;了解图像质量的度量方式 在图像处理和计算机视觉领域&#xff0c;评价图像质量的准确性对于许多应用至关重要。通过合适的评价指标&#xff0c;我们可以量化图像的质量&#xff0c;从而更好地了解图像处理算法的效果和改进空间。本文将介绍图像质…

英语学习笔记12——名词所有格的运用

Whose is this … ? This is my/your/his/her … 这……是谁的&#xff1f;这是我的 / 你的 / 他的 / 她的…… Whose is that … ? That is my/your/his/her … 那……是谁的&#xff1f;那是我的 / 你的 / 他的 / 她的…… 词汇 Vocabulary father n. 爸爸 口语&#xf…

2024统计建模成品论文39页(附带完整数据集和代码)

2024统计建模成品论文完整版一等奖论文【1.5w字全网最佳】2024统计建模大赛高质量成品论文39页配套完整代码运行全套数据集https://www.jdmm.cc/file/2710661/

在idea中使用vue

一、安装node.js 1、在node.js官网&#xff08;下载 | Node.js 中文网&#xff09;上下载适合自己电脑版本的node.js压缩包 2、下载完成后进行解压并安装&#xff0c;一定要记住自己的安装路径 一直点击next即可&#xff0c;这部选第一个 3、安装成功后&#xff0c;按住winR输入…

如何使用 ArcGIS Pro 计算容积率

容积率是指地上建筑物的总面积与用地面积的比率&#xff0c;数值越小越舒适&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 计算容积率&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的建筑和小区数据&#xff0c;除了建筑和小区数据&am…

【408精华知识】速看!各种排序的大总结!

文章目录 一、插入排序&#xff08;一&#xff09;直接插入排序&#xff08;二&#xff09;折半插入排序&#xff08;三&#xff09;希尔排序 二、交换排序&#xff08;一&#xff09;冒泡排序&#xff08;二&#xff09;快速排序 三、选择排序&#xff08;一&#xff09;简单选…

【Arduino】数字I/O的使用

目录 1、引脚工作模式 2、写入引脚digitaWrite&#xff08;&#xff09; 3、读取引脚digitalRead(pin); 4、示例 跑马灯 1、引脚工作模式 Arduino通过pinMode()设置引脚的io工作模式&#xff0c;一共有4种模式 工作模式 Mode 说明 输出模式 OUTPUT 引脚为低阻抗状态&…

YOLOv9改进策略目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

&#x1f451; YOLOv9有效涨点专栏目录 &#x1f451; 专栏视频介绍&#xff1a;包括专栏介绍、得到的项目文件、模型二次创新、权重文件的使用问题&#xff0c;点击即可跳转。 前言 Hello&#xff0c;各位读者们好 本专栏自开设两个月以来已经更新改进教程50余篇其中包含Re…

foxmail简介

Foxmail是一款电子邮件客户端软件&#xff0c;它最初由中国的程序员张小龙开发&#xff0c;后来被腾讯公司收购并继续开发。Foxmail以其轻量级、易于使用和强大的邮件管理功能而受到用户的喜爱。 1. **起源**&#xff1a;Foxmail在1997年由张小龙开发&#xff0c;最初是作为一…