UGUI_界面拖动和焦点界面
2016-03-09 19:40
357 查看
UGUI_界面拖动和焦点界面
一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面【点击后变成焦点界面显示在最前面】。如下图:
UGUI的官方例子中有实现拖动的脚本DragPanel,不过它没支持界面排序,加个排序很简单,在按下鼠标时调用tranform的SetSiblingIndex即可,值越大越靠前,在这里我只是简单的实现了这个基本功能,最终用到项目是需要设计一下的,因为很多时候需要记录打开界面的一些信息,在这里就不多说了。
代码:
一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面【点击后变成焦点界面显示在最前面】。如下图:
UGUI的官方例子中有实现拖动的脚本DragPanel,不过它没支持界面排序,加个排序很简单,在按下鼠标时调用tranform的SetSiblingIndex即可,值越大越靠前,在这里我只是简单的实现了这个基本功能,最终用到项目是需要设计一下的,因为很多时候需要记录打开界面的一些信息,在这里就不多说了。
代码:
using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections; public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler { // 鼠标起点 private Vector2 originalLocalPointerPosition; // 面板起点 private Vector3 originalPanelLocalPosition; // 当前面板 private RectTransform panelRectTransform; // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小 private RectTransform parentRectTransform; private static int siblingIndex = 0; void Awake () { panelRectTransform = transform.parent as RectTransform; parentRectTransform = panelRectTransform.parent as RectTransform; } // 鼠标按下 public void OnPointerDown (PointerEventData data) { siblingIndex++; panelRectTransform.transform.SetSiblingIndex(siblingIndex); // 记录当前面板起点 originalPanelLocalPosition = panelRectTransform.localPosition; // 通过屏幕中的鼠标点,获取在父节点中的鼠标点 // parentRectTransform:父节点 // data.position:当前鼠标位置 // data.pressEventCamera:当前事件的摄像机 // originalLocalPointerPosition:获取当前鼠标起点 RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition); } // 拖动 public void OnDrag (PointerEventData data) { if (panelRectTransform == null || parentRectTransform == null) return; Vector2 localPointerPosition; // 获取本地鼠标位置 if (RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition)) { // 移动位置 = 本地鼠标当前位置 - 本地鼠标起点位置 Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition; // 当前面板位置 = 面板起点 + 移动位置 panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal; } ClampToWindow (); } // 限制当前面板在父节点中的区域位置 void ClampToWindow () { // 面板位置 Vector3 pos = panelRectTransform.localPosition; // 如果是UI父节点,设置面板大小为0,那么最大最小位置为正负屏幕的一半 Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min; Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max; pos.x = Mathf.Clamp (panelRectTransform.localPosition.x, minPosition.x, maxPosition.x); pos.y = Mathf.Clamp (panelRectTransform.localPosition.y, minPosition.y, maxPosition.y); panelRectTransform.localPosition = pos; } }
相关文章推荐
- HDU-1242-Rescue(优先队列+BFS)
- Leetcode 303. Range Sum Query - Immutabled
- Druid数据库连接池简单使用介绍
- QT GUI界面假死的处理
- 不重启调试SystemUI
- UITextField左边缩进
- IOS中UIImage与UIColor相互转化
- 一行代码设置UITableView分割线的长度
- uilib 学习属性表
- An internal error occurred during: "Build Project". GC overhead limit exceeded
- nyoj-686-An Interesting Sequence【分解质因数】
- UITextInputMode类的使用
- iosUI篇- 多控制器和导航控制器简单介绍
- 自定义UITableViewCell(registerNib: 与 registerClass: 的区别)
- iOS UIScrollView使用Autolayout
- IOS_UITableViewCell(UITabel)自动适应Row高
- Epic Games王祢:UE4在移动平台的开发优势
- UI学习第08天
- 让build自动增长的脚本
- iOS 9人机界面指南(四):UI元素