赞
踩
注:代码来源于unity源码
作用:滚动矩形与遮罩 (Mask) 相结合来创建滚动视图,在产生的视图中只有滚动矩形内的可滚动内容为可见状态。
使用 GameObject > UI > Scroll View 菜单选项时,默认情况下会采用此设置:
视口可以是根游戏对象,也可以是作为根的子项的单独游戏对象。如果使用自动隐藏的滚动条,则视口必须是子项。
· 使用内容 RectTransform 的轴心和锚点可以确定内容伸缩时在滚动视图内的对齐方式。如果内容应与顶部保持对齐,请将锚点设置为父项的顶部,并将轴心设置为顶部位置。
On Value Changed:滚动矩形的滚动位置发生变化时调用的 UnityEvent。该事件可将当前滚动位置作为 Vector2 类型动态参数发送。
normalizedPosition:当前滚动位置,Vector2类型,位于(0,0)和(1,1)之间,(0,0)位于左下角。
定义:
public Vector2 normalizedPosition { get { return new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition); } set { SetNormalizedPosition(value.x, 0); SetNormalizedPosition(value.y, 1); } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
使用示例:
using UnityEngine; using System.Collections; using UnityEngine.UI; // Required when Using UI elements. public class ExampleClass : MonoBehaviour { public ScrollRect myScrollRect; public Vector2 myPosition = new Vector2(0.5f, 0.5f); public void Start() { //Change the current scroll position. myScrollRect.normalizedPosition = myPosition; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
[Serializable]
/// <summary>
/// Event type used by the ScrollRect.
/// </summary>
public class ScrollRectEvent : UnityEvent<Vector2> {}
[SerializeField]
private ScrollRectEvent m_OnValueChanged = new ScrollRectEvent();
public ScrollRectEvent onValueChanged { get { return m_OnValueChanged; } set { m_OnValueChanged = value; } }
using UnityEngine; using UnityEngine.UI; public class ExampleScript : MonoBehaviour { static ScrollRect scrollRect; void Start() { scrollRect = GetComponent<ScrollRect>(); scrollRect.onValueChanged.AddListener(ListenerMethod); } public void ListenerMethod(Vector2 value) { Debug.Log("ListenerMethod: " + value); } }
//只读 var trans = ScrollRect.transform; var obj = ScrollRect.gameObject; //由布局系统调用 var floata = ScrollRect.flexibleHeight; var floatb = ScrollRect.flexibleWidth; var inta = ScrollRect.layoutPriority;//优先级 var floatc = ScrollRect.minHeight; var floatd = ScrollRect.preferredHeight; //继承自Behaviour var bbola = ScrollRect.isActiveAndEnabled; //可写 ScrollRect.normalizedPosition = new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition); //(x,y):滚动位置,content相对于viewport的位置,(0,0)代表左下角 ScrollRect.verticalNormalizedPosition = 1f; ScrollRect.horizontalNormalizedPosition = 1f; ScrollRect.velocity = new Vector2();//content的移速,单位为每秒 ScrollRect.enabled = true;//继承自Behaviour,启用更新updated ScrollRect.name = ""; ScrollRect.runInEditMode = true; //继承自MonoBehaviour,允许一个特定的MonoBehaviour实例在编辑模式下运行(仅在编辑器中可用) ScrollRect.tag = ""; //继承自Component,The tag of this gameobject. ScrollRect.useGUILayout = true; //继承自Component,禁用此功能可以跳过GUI布局阶段。 ScrollRect.hideFlags = HideFlags.HideAndDontSave;//继承自Object,对象应该被隐藏,保存在场景中,或用户是否可以修改 /* public enum HideFlags { None = 0, //A normal, visible object. This is the default. HideInHierarchy = 1, //The object will not appear in the hierarchy. HideInInspector = 2, //It is not possible to view it in the inspector. DontSaveInEditor = 4, //The object will not be saved to the Scene in the editor. NotEditable = 8, //The object is not be editable in the inspector.< DontSaveInBuild = 16, // 0x00000010,The object will not be saved when building a player. DontUnloadUnusedAsset = 32, // 0x00000020,The object will not be unloaded by Resources.UnloadUnusedAssets. DontSave = DontUnloadUnusedAsset | DontSaveInBuild | DontSaveInEditor, // 0x00000034,The object will not be saved to the Scene. It will not be destroyed when a new Scene is loaded. It is a shortcut for HideFlags.DontSaveInBuild | HideFlags.DontSaveInEditor | HideFlags.DontUnloadUnusedAsset. HideAndDontSave = DontSave | NotEditable | HideInHierarchy, // 0x0000003D,The GameObject is not shown in the Hierarchy, not saved to to Scenes, and not unloaded by Resources.UnloadUnusedAssets. } */
1)Rebuild(CanvasUpdate executing): void
2)LayoutComplete(): void
3)GraphicUpdateComplete(): void
4)IsActive(): bool
5)StopMovement(): void 实现:将两个轴上的速度设置为零,以便内容停止移动。
6)OnScroll(PointerEventData data): void
7)OnInitializePotentialDrag(PointerEventData eventData): void
8)OnBeginDrag(PointerEventData eventData): void
9)OnEndDrag(PointerEventData eventData): void
10)OnDrag(PointerEventData eventData): void
11)CalculateLayoutInputHorizontal(): void
12)CalculateLayoutInputVertical(): void
13)SetLayoutHorizontal(): void
14)SetLayoutVertical(): void
函数名 | 说明 |
---|---|
BroadcastMessage | 调用此游戏对象或其任何子项中的每个 MonoBehaviour 上名为 methodName 的方法。 |
CompareTag | 此游戏对象是否使用 tag 进行了标记? |
GetComponent | 如果游戏对象附加了类型为 type 的组件,则将其返回,否则返回 null。 |
GetComponentInChildren | 使用深度首次搜索返回 GameObject 或其任何子项中类型为 type 的组件。 |
GetComponentInParent | 返回 GameObject 或其任何父项中类型为 type 的组件。 |
GetComponents | 返回 GameObject 中类型为 type 的所有组件。 |
GetComponentsInChildren | 返回 GameObject 或其任何子项中类型为 type 的所有组件。 |
GetComponentsInParent | 返回 GameObject 或其任何父项中类型为 type 的所有组件。 |
SendMessage | 调用此游戏对象中的每个 MonoBehaviour 上名为 methodName 的方法。 |
SendMessageUpwards | 调用此游戏对象中的每个 MonoBehaviour 上或此行为的每个父级上名为 methodName 的方法。 |
CancelInvoke | 取消该 MonoBehaviour 上的所有 Invoke 调用。 |
Invoke | 在 time 秒后调用 methodName 方法。 |
InvokeRepeating | 在 time 秒后调用 methodName 方法,然后每 repeatRate 秒调用一次。 |
IsInvoking | 是否有任何待处理的 methodName 调用? |
StartCoroutine | 启动一个协同程序。 |
StopAllCoroutines | 停止在该行为上运行的所有协同程序。 |
StopCoroutine | 停止在该行为上运行的第一个名为 methodName 的协同程序或存储在 routine 中的协同程序。 |
GetInstanceID | 返回对象的实例 ID。 |
ToString | 返回 GameObject 的名称。 |
IsDestroyed | 如果行为的原生表示已被销毁,则返回 true。 |
函数名 | 说明 |
---|---|
Awake | Awake 在加载脚本实例时调用。 |
FixedUpdate | 用于物理计算且独立于帧率的 MonoBehaviour.FixedUpdate 消息。 |
LateUpdate | 如果启用了 Behaviour,则每帧调用 LateUpdate。 |
OnAnimatorIK | 用于设置动画 IK(反向运动学)的回调。 |
OnAnimatorMove | 用于处理动画移动以修改根运动的回调。 |
OnApplicationFocus | 当玩家获得或失去焦点时,发送给所有 GameObject。 |
OnApplicationPause | 当应用程序暂停时,发送给所有 GameObject。 |
OnApplicationQuit | 在应用程序退出前,发送给所有游戏对象。 |
OnAudioFilterRead | 如果实现了 OnAudioFilterRead,Unity 将在音频 DSP 链中插入一个自定义滤波器。 |
OnBecameInvisible | OnBecameInvisible 在渲染器对任何摄像机都不可见时调用。 |
OnBecameVisible | OnBecameVisible 在渲染器变为对任意摄像机可见时调用。 |
OnCollisionEnter | 当该碰撞体/刚体已开始接触另一个刚体/碰撞体时,调用 OnCollisionEnter。 |
OnCollisionEnter2D | 当传入碰撞体与该对象的碰撞体接触时发送(仅限 2D 物理)。 |
OnCollisionExit | 当该碰撞体/刚体已停止接触另一个刚体/碰撞体时,调用 OnCollisionExit。 |
OnCollisionExit2D | 当另一个对象上的碰撞体停止接触该对象的碰撞体时发送(仅限 2D 物理)。 |
OnCollisionStay | 对应正在接触刚体/碰撞体的每一个碰撞体/刚体,每帧调用一次 :ref::OnCollisionStay。 |
OnCollisionStay2D | 在另一个对象上的碰撞体正在接触该对象的碰撞体时发送每个帧(仅限 2D 物理)。 |
OnConnectedToServer | 成功连接到服务器后在客户端上调用。 |
OnControllerColliderHit | 当该控制器在执行 Move 时撞到碰撞体时调用 OnControllerColliderHit。 |
OnDestroy | 销毁附加的行为将导致游戏或场景收到 OnDestroy。 |
OnDisconnectedFromServer | 当连接丢失或与服务器断开连接时,在客户端上调用。 |
OnDrawGizmos | 如果您想绘制能够选择并且始终绘制的辅助图标,则可以实现 OnDrawGizmos。 |
OnDrawGizmosSelected | 如果选择了对象,则实现 OnDrawGizmosSelected 来绘制辅助图标。 |
OnEnable | 该函数在对象变为启用和激活状态时调用。 |
OnFailedToConnect | 出于某种原因连接尝试失败时,在客户端上调用。 |
OnFailedToConnectToMasterServer | 在连接到 MasterServer 时发生问题的情况下,在客户端或服务器上调用。 |
OnGUI | 系统调用 OnGUI 来渲染和处理 GUI 事件。 |
OnJointBreak | 在附加到相同游戏对象的关节断开时调用。 |
OnJointBreak2D | 在附加到相同游戏对象的 Joint2D 断开时调用。 |
OnMasterServerEvent | 在从 MasterServer 报告事件时,在客户端或服务器上调用。 |
OnMouseDown | 当用户在 GUIElement 或 Collider 上按下鼠标按钮时,将调用 OnMouseDown。 |
OnMouseDrag | 当用户单击 GUIElement 或 Collider 并仍然按住鼠标时,将调用 OnMouseDrag。 |
OnMouseEnter | 当鼠标进入 GUIElement 或 Collider 时调用。 |
OnMouseExit | 当鼠标不再处于 GUIElement 或 Collider 上方时调用。 |
OnMouseOver | 当鼠标悬停在 GUIElement 或 Collider 上时,每帧调用一次。 |
OnMouseUp | 当用户松开鼠标按钮时,将调用 OnMouseUp。 |
OnMouseUpAsButton | 松开鼠标时,仅当鼠标在按下时所在的 GUIElement 或 Collider 上时,才调用 OnMouseUpAsButton。 |
OnNetworkInstantiate | 在已通过 Network.Instantiate 进行网络实例化的对象上调用。 |
OnParticleCollision | 当粒子击中碰撞体时,将调用 OnParticleCollision。 |
OnParticleSystemStopped | 系统中的所有粒子都死亡时,便会调用 OnParticleSystemStopped,然后将不再产生新粒子。在调用 Stop 之后,或者超过非循环系统的 Duration 属性时,将停止产生新粒子。 |
OnParticleTrigger | 粒子系统中的任何粒子满足触发模块中的条件时,将调用 OnParticleTrigger。 |
OnPlayerConnected | 每当有新玩家成功连接,就在服务器上调用。 |
OnPlayerDisconnected | 每当有玩家与服务器断开连接,就在服务器上调用。 |
OnPostRender | 在摄像机完成场景渲染后,将调用 OnPostRender。 |
OnPreCull | 在摄像机剔除场景前,将调用 OnPreCull。 |
OnPreRender | 在摄像机开始渲染场景前,将调用 OnPreRender。 |
OnRenderImage | OnRenderImage 在图像的所有渲染操作全部完成后调用。 |
OnRenderObject | 在摄像机渲染场景后,将调用 OnRenderObject。 |
OnSerializeNetworkView | 用于在网络视图监视的脚本中自定义变量同步。 |
OnServerInitialized | 每当调用 Network.InitializeServer 并且完成时,对该服务器调用该函数。 |
OnTransformChildrenChanged | 当 GameObject 的变换的子项列表发生更改时,将调用该函数。 |
OnTransformParentChanged | 当 GameObject 的变换的父属性发生更改时,将调用该函数。 |
OnTriggerEnter | GameObject 与另一 GameObject 碰撞时,将调用 OnTriggerEnter。 |
OnTriggerEnter2D | 当另一个对象进入附加到该对象的触发碰撞体时发送(仅限 2D 物理)。 |
OnTriggerExit | 当 Collider other 已停止接触该触发器时调用 OnTriggerExit。 |
OnTriggerExit2D | 当另一个对象离开附加到该对象的触发碰撞体时发送(仅限 2D 物理)。 |
OnTriggerStay | 对于接触触发器的每一个 Collider /other/,每次物理更新调用一次 OnTriggerStay。 |
OnTriggerStay2D | 在另一个对象位于附加到该对象的触发碰撞体之内时发送每个帧(仅限 2D 物理)。 |
OnValidate | 加载脚本后或 Inspector 中的值发生更改时,将调用该函数(只能在 Editor 中调用)。 |
OnWillRenderObject | 如果对象可见并且不是 UI 元素,则为每个摄像机调用 OnWillRenderObject。 |
Reset | 重置为默认值。 |
Start | 在首次调用任何 Update 方法之前启用脚本时,在帧上调用 Start。 |
Update | 如果启用了 MonoBehaviour,则每帧调用 Update。 |
LateUpdate()
ScrollRect还重写了LateUpdate,这个方法是在所有组件Update调用完之后,每一帧都会被调用。在这个方法里,调用EnsureLayoutHasRebuilt确保Layout已经被重建,接着UpdateBounds更新边界。
如果m_Dragging为false,且content已经超出了可滚动范围(如果是Horizontal方向,计算当contentBounds的最小值的x大于viewBounds的最小值的x或contentBounds的最大值的x小于viewBounds的最大值的x时的offset偏移。如果offset不为0,就判定超出了可滚动范围。Vertical方向同理),且m_Velocity速度不为0,当ScrollRect设置为MovementType.Elastic,如果m_Inertia(惯性)为true,便根据m_DecelerationRate计算出一个新的惯性速度m_Velocity,否则应用弹簧物理的阻尼效果。便根据速度逐渐将content的坐标修正为合理的值。当ScrollRect设置为MovementType.Clamped,在ScrollRect原来位置的基础上直接加上Offset偏移。
如果在拖动中m_Dragging为true且m_Inertia(惯性)为true便根据content的当前位置和m_PrevPosition计算出一个新的惯性速度m_Velocity。
然后判断如果m_ViewBounds、m_ContentBounds、m_Content.anchoredPosition和旧数据不同,则更新Scrollbar的位置,发送OnValueChanged,并保存当前数据为旧数据。
最后,调用UpdateScrollbarVisibility更新ScrollBar的可见性。
补充知识点sizeDelta:
RectTransform.sizeDelta RectTransform的大小相对于锚点的距离。
如果锚点相同,sizeDelta的大小与RectTransform大小相同,如果锚点在四个父项的四个角中,sizeDelta的大小表示该RectTransform相比于父项的大小多少。
补充知识点RectTransform变换:
定位矩形变换时,首先确定它是否具有任何伸展行为,这很有用。当anchorMin和anchorMax属性不相同时会出现拉伸行为。
对于非拉伸Rect变换,通过设置anchoredPosition和sizeDelta属性可以非常容易地设置位置。anchoredPosition指定枢轴相对于锚点的位置。sizeDelta与没有拉伸时的大小相同。
对于拉伸Rect变换,使用offsetMin和offsetMax属性可以更简单地设置位置。offsetMin属性指定相对于左下角锚点的矩形的左下角。offsetMax属性指定相对于右上角锚点的矩形右上角。
补充知识点RectTransform:
RectTransform.GetWorldCorners 获取RectTransform的四个角的世界坐标。
遮罩(Mask) 不是可见的 UI 控件,而是一种修改控件子元素外观的方法。遮罩将子元素限制(即“掩盖”)为父元素的形状。因此,如果子项比父项大,则子项仅包含在父项以内的部分才可见。
Show Mask Graphic :是否应在子对象上使用 Alpha 绘制遮罩(父)对象的图形,就是是否显示该对象的Image。
遮罩的常见用法:
1)使用面板 (Panel) 对象作为“框架”显示大型图像的一小部分。为实现此目的,可先将图像设置为面板对象的子项。应调整图像的位置,使应该可见的区域直接位于面板区域的后面。
2)将一个遮罩组件添加到面板。面板外面的子图像区域将变得不可见,因为这些区域被面板的形状所掩盖。
3)如果图像随后移动,则只有面板暴露的部分可见。可通过滚动条来控制移动,从而创建可滚动的地图查看器之类的效果。
实现: 应使用 GPU 的模板缓冲区来实现遮罩。
第一个遮罩元素将 1 写入模板缓冲区。 遮罩下面的所有元素在渲染时进行检查,仅渲染到模板缓冲区中有 1 的区域。 *嵌套的遮罩会将增量位掩码写入缓冲区,这意味着可渲染的子项需要具有要渲染的逻辑和模板值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。