3.8 KiB
#unity/日常积累
窗体会有一个图片,挂上脚本;
这个脚本,有继承自,拖曳相关的;
最开始的时候,设定默认值,在开始拖曳的时候,就设定一下偏移值; 然后在拖曳期间,将eventData的位置信息,加上偏移值信息,就是新的自身的position了;
然后,到了检测canvas画布的类;
还需要检测,当前鼠标是否在当前面板;
调用的这个方法,是跳转到这里;
检测完成后,还需要判断一下,是否存在方向;
默认是没有方向的,还是先检测,在当前画布模式下,鼠标的位置是否在物体里面; 然后,通过一个方法,获取到物体的四个角的值;
这个获取四个角在屏幕坐标的方法,虽然是包含了,判断renderMode不为OverLay这个模式的情况下,会怎么处理,但实际上,这个是无法生效的,不用管;
然后,分别计算一下,鼠标的x和y,跟四个角的距离差值;
然后,计算一下,鼠标位置,和角标的距离;
还有一个,右下角的,鼠标和角标之间的距离;
以上这几个返回的,都是右上,左上之类的,包含两个方向的;
除此之外,还有单独一个方向的;
这个也是,返回向下方向的,然后,最终返回计算得到的方向值;
可以看到,前面的这个判断,是鼠标Down的那个时刻; 后面如果鼠标持续按下,就是else部分的判断了;
如果以上俩条件都满足的话,就设置一个lastPos是鼠标的位置,显示icon(前面判断方向的时候,icon的localRotation已经设置过的),并且隐藏鼠标的图标;
前面判断了,isDraging是true之后,如果鼠标左键,持续点击的情况,就是图标的位置,也是随着鼠标的位置而改变,偏移值就是鼠标的位置,减去前面赋值的lastPos位置;
然后,窗体是有定义两个宽高区间的,拖曳拉伸,不能超过这俩范围;
然后,这里就是,处理拖曳窗体的方法,传参是方向和偏移量;
先确认一下,这个Clamp api接口,是用来限制范围的;
继续,这个Sign api接口,是用来限制方向的;
这Abs是返回绝对值的;
然后,就是拖曳窗体的方法,先根据方向,计算不同情况下的size数值;
计算之后,通过区域限制,差值计算,得到新位置,然后通过工具类的SetRectTransformSizeWithCurrentAnchors()方法,设置一下宽高;
x和y的数值,是宽高修改之后的,减半数值;(unity中,实际拖曳就是这个效果,实际操作一下就知道了)
具体实现:
如果不是拖曳,又还是放在边缘位置,也还是修改表现即可;
补充一下,父类;
似乎在找单例的时候,会加锁,还没深究;