RectTransform.SetSizeWithCurrentAnchors的实例应用

记得之前写过一个一篇文章《Unity3D UGUI运行时实现Editor视窗中的UI编辑功能》当时用到了一个UGUI的API RectTransform.SetInsetAndSizeFromParentEdge ,后来又看到有另一个API,是RectTransform.SetSizeWithCurrentAnchors详细的看了看官方文档的介绍,它说的意思是根据当前锚点布局去水平或垂直方向的改变,如果父rectTransform的size改变了,那么它的rect也会改变,所以最好不要把RectTransform的 anchors 设置为那几种可自适应拉伸的stretch,要么你就在父rectTransform改变时,重新再调用这个API再次。温故而知新,我又回头看了看之前的那篇文章和代码,觉得原先的实现方法并不好,尤其是调整了UI的Rotation后,对于边缘悬浮检测,以及拉伸UI的操作都是不正确的,所以决定换RectTransform.SetSizeWithCurrentAnchors这个API,从而实现边角悬浮旋转交互,以及各种角度下的拉伸操作。
首先我们回看之前的实现思路: 鼠标移动到控件边缘------>可以拖拽调整大小了--------->按下鼠标拖拽左侧边框时用先计算出此时距离父节点右侧边的距离和当前x轴方向上控件大小,算出鼠标x轴方向移动差值,利用这个API调整控件大小-------->松开鼠标操作结束。 它在UI控件有一定旋转角度时利用RectTransform.SetInsetAndSizeFromParentEdge去设置距离父节点RectTransform边缘的距离就是不对的,在这种情况下,我们如果用RectTransform.SetSizeWithCurrentAnchors这个API就可以,只不过我们要在计算在水平和垂直方向上的两个拉伸分量,去分别调用这个API,调整UI水平和垂直方向上的size,并且要利用拉伸量去重新计算下该控件的位置。
首先先探讨下检测可操作的实现思路,如图:在这里插入图片描述
检测触发区域的数学模型
关于检测一个点是否在一个多边形内的算法问题,我们可以探讨下,我在这里简单写了一个数学工具类,用于解决这个问题。简单看下它的内容:
在这里插入图片描述
我就简单写了两个类,一个是Line2D(有方向的线段),一个是Polygon2D。如果把一条线段看成是无限延长的直线,那么点和线的关系就归为三种:在直线的左侧,在直线的右侧,在直线上。这里的多边形,Polygon2D,我们看做是一组有向线段,按顺时针顺序连接成的一个封闭的多边形。我们想,给定一个点,如果它都在所有线段的同一侧(按顺时针是右侧),那是不是就可以确定它是在多边形内。于是我就采用这样的方式来计算当前鼠标是否在悬浮区域的四个多边形内,来判断是否触发可拉伸操作。
在这里插入图片描述
其实呢,**这样的方法是错误的!!!!!!**因为上面的实例,我们只是给一个矩形(凸多边形),没问题,如果给你一个凹多边形,这样算就是错误的!!!你可以想象给你一个在“凹”中间小坑里的点……
关于点是否在一个多边形的问题,可以参考下一下的文章:
https://blog.csdn.net/lynon/article/details/82015834

https://blog.csdn.net/qq_39108767/article/details/89813886?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

有了这个思路,算法,那么旋转检测我们只需先判断如果不在拉伸区域,那么距离控件四个角的距离是否在我们规定的距离内,就可以判断是否在旋转触发区域就可以了。
拉伸的计算如图:
在这里插入图片描述
这样算出RectTransform.SetSizeWithCurrentAnchors 的size参数,在拖拽完成时进行调用,同时还要算出此时UI控件中心点位置的变化,进行更新,就可以了。看下效果:
在这里插入图片描述
这个工具里的细节还有很多,比如UI控件的旋转问题,触发检测数值临界点的判断,在不同canvas模式下的坐标变化等等,不再一一展开说了,感兴趣的小伙伴可以下载源码自行查看,也希望能一起探讨,发现问题,再去完善。谢谢~
工程源码

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值