http://blog.sina.com.cn/s/blog_89d90b7c0102vj9e.html

一般软件和游戏有多窗口多界面时,都可以拖动子界面和排序子界面【点击后变成焦点界面显示在最前面】。如下图:

UGUI的官方例子中有实现拖动的脚本DragPanel,不过它没支持界面排序,加个排序很简单,在按下鼠标时调用tranform的SetSiblingIndex即可,值越大越靠前,在这里我只是简单的实现了这个基本功能,最终用到项目是需要设计一下的,因为很多时候需要记录打开界面的一些信息,在这里就不多说了。

代码如下:

  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.EventSystems;
  4. using System.Collections;
  5. public class DragPanel : MonoBehaviour, IPointerDownHandler, IDragHandler {
  6. // 鼠标起点
  7. private Vector2 originalLocalPointerPosition;
  8. // 面板起点
  9. private Vector3 originalPanelLocalPosition;
  10. // 当前面板
  11. private RectTransform panelRectTransform;
  12. // 父节点,这个最好是UI父节点,因为它的矩形大小刚好是屏幕大小
  13. private RectTransform parentRectTransform;
  14. ;
  15. void Awake () {
  16. panelRectTransform = transform.parent as RectTransform;
  17. parentRectTransform = panelRectTransform.parent as RectTransform;
  18. }
  19. // 鼠标按下
  20. public void OnPointerDown (PointerEventData data) {
  21. siblingIndex++;
  22. panelRectTransform.transform.SetSiblingIndex(siblingIndex);
  23. // 记录当前面板起点
  24. originalPanelLocalPosition = panelRectTransform.localPosition;
  25. // 通过屏幕中的鼠标点,获取在父节点中的鼠标点
  26. // parentRectTransform:父节点
  27. // data.position:当前鼠标位置
  28. // data.pressEventCamera:当前事件的摄像机
  29. // originalLocalPointerPosition:获取当前鼠标起点
  30. RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);
  31. }
  32. // 拖动
  33. public void OnDrag (PointerEventData data) {
  34. if (panelRectTransform == null || parentRectTransform == null)
  35. return;
  36. Vector2 localPointerPosition;
  37. // 获取本地鼠标位置
  38. if (RectTransformUtility.ScreenPointToLocalPointInRectangle (parentRectTransform, data.position, data.pressEventCamera, out localPointerPosition)) {
  39. // 移动位置 = 本地鼠标当前位置 - 本地鼠标起点位置
  40. Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
  41. // 当前面板位置 = 面板起点 + 移动位置
  42. panelRectTransform.localPosition = originalPanelLocalPosition + offsetToOriginal;
  43. }
  44. ClampToWindow ();
  45. }
  46. // 限制当前面板在父节点中的区域位置
  47. void ClampToWindow () {
  48. // 面板位置
  49. Vector3 pos = panelRectTransform.localPosition;
  50. // 如果是UI父节点,设置面板大小为0,那么最大最小位置为正负屏幕的一半
  51. Vector3 minPosition = parentRectTransform.rect.min - panelRectTransform.rect.min;
  52. Vector3 maxPosition = parentRectTransform.rect.max - panelRectTransform.rect.max;
  53. pos.x = Mathf.Clamp (panelRectTransform.localPosition.x, minPosition.x, maxPosition.x);
  54. pos.y = Mathf.Clamp (panelRectTransform.localPosition.y, minPosition.y, maxPosition.y);
  55. panelRectTransform.localPosition = pos;
  56. }
  57. }

UGUI(七)界面拖动和焦点界面的更多相关文章

  1. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源码

    在android学习中,动作交互是软件中重要的一部分,其中的Scroller就是提供了拖动效果的类,在网上,比如说一些Launcher实现滑屏都可以通过这个类去实现.下面要说的就是上次Scroller ...

  2. Android 仿 窗帘效果 和 登录界面拖动效果 (Scroller类的应用) 附 2个DEMO及源代码

    在android学习中,动作交互是软件中重要的一部分.当中的Scroller就是提供了拖动效果的类,在网上.比方说一些Launcher实现滑屏都能够通过这个类去实现.以下要说的就是上次Scroller ...

  3. 如何在Winform界面中设计图文并茂的界面

    在Winform里面,很多控件元素都是标准的,如图标.按钮.工具栏等等,所以一般设计标准的Winform界面比较快捷,但是往往这样的界面相对单调一些,特别在界面控件比较少的情况下,我们往往需要加入一些 ...

  4. Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面

    现在开发中的功能需要直接跳转到拨号.联系人.短信界面等等,查找了很多资料,自己整理了一下. 1.跳转到拨号界面,代码如下: 1)直接拨打 Intent intentPhone = new Intent ...

  5. linux直接启动到字符界面或从字符界面启动到图形化界面

    修改/etc/inittab文件 将内容为:"id:5:initdefault"的行的数字5改为3,保存重启即可直接进入字符界面 PS:3和5分别表示运行级别 从字符界面启动到图形 ...

  6. Java图形界面学习---------简易登录界面

    /** * @author Administrator * Java图形界面学习---------简易登录界面 * date:2015/10/31 */ import java.awt.BorderL ...

  7. C# winform 打开主界面并关闭登录界面

    在winform 界面编程中,我们有时候要在主界面打开之前先显示登录界面,当登录界面用户信息校验正确后才打开主界面,而这时登陆界面也完成使命该功成身退了. 目前有两种方法可实现: 方法1. 隐藏登录界 ...

  8. Android 打开设置界面或者WiFi连接界面

    1.使用APP打开系统的设置界面或者WiFi连接界面 startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS)); //直接进入手机中的wifi网 ...

  9. react中界面跳转 A界面跳B界面,返回A界面,A界面状态保持不变 redux的state方法

    在上一篇文章中说过了react中界面A跳到B,返回A,A界面状态保持不变,上篇中使用的是传统的localStorage方法,现在来使用第二种redux的state方法来实现这个功能 现在我刚接触red ...

随机推荐

  1. 3款Linux网络监视工具

    1 iftop: 如果你想看到现在你的带宽到底是哪些应用在使用,并且各个应用占据了多少带宽的时候,可以用iftop显示出来.使用的参数如下: -h                  display t ...

  2. SpringBoot学习笔记(10):使用MongoDB来访问数据

    SpringBoot学习笔记(10):使用MongoDB来访问数据 快速开始 本指南将引导您完成使用Spring Data MongoDB构建应用程序的过程,该应用程序将数据存储在MongoDB(基于 ...

  3. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

  4. [egret+pomelo]实时对战游戏杂记(5)

    之前大体了解了pomelo服务端的运行的大体运行流程,下面详细的学习一下在服务端比较重要的一个容器模块bearcat,在bearcat的wiki中我们可以对其有个大概的了解,在服务端示例的代码中也大量 ...

  5. git创建项目的两种方式

    场景1: 将本地内容推送给远程库 1.创建版本库 git init 将此目录转换为git可管理的仓库 git config --global user.name "xx" 或 gi ...

  6. 安装wampserver 计算机丢失msvcr100.dll

    刚刚重新安装了Windows 7 64位系统,再安装Wampserver 2时却提示系统错误,如下图所示: 在网上下载了MSVCR100.dll放到system32文件夹下依然没有用. 百度搜索了一下 ...

  7. git 生成patch和应用patch【转】

    本文转载自:http://www.jianshu.com/p/814fb6606734 1.在git源码目录下执行 1.1.两个commit间的修改(包含两个commit) git format-pa ...

  8. 让LoadRunner再次走下神坛

    1.        LoadRunner 阻碍了性能测试人员对通信过程的理解我希望做性能测试的人能忘掉这个工具.我们都知道VuGen有录制的功能,其实录制这个功能对于测试来说是个非常不好的选择,就是跟 ...

  9. 【Lintcode】112.Remove Duplicates from Sorted List

    题目: Given a sorted linked list, delete all duplicates such that each element appear only once. Examp ...

  10. python爬虫知识点详解

    python爬虫知识点总结(一)库的安装 python爬虫知识点总结(二)爬虫的基本原理 python爬虫知识点总结(三)urllib库详解 python爬虫知识点总结(四)Requests库的基本使 ...