修复BUG
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
@@ -8,13 +9,13 @@ namespace MuHua {
|
||||
/// <summary>
|
||||
/// 滚动视图 - 垂直
|
||||
/// </summary>
|
||||
public class UIScrollViewV : ModuleUIPanel {
|
||||
public class UIScrollViewV : ModuleUIPanel, IDisposable {
|
||||
/// <summary> 绑定的画布 </summary>
|
||||
public readonly VisualElement canvas;
|
||||
/// <summary> 元素方向 </summary>
|
||||
public readonly UIDirection direction;
|
||||
/// <summary> 垂直滑块 </summary>
|
||||
public readonly UIScroller vertical;
|
||||
public readonly UIScrollerV vertical;
|
||||
/// <summary> 值改变时 </summary>
|
||||
public event Action<float> ValueChanged;
|
||||
|
||||
@@ -31,35 +32,43 @@ namespace MuHua {
|
||||
public Vector3 originalPosition;
|
||||
public Vector3 pointerPosition;
|
||||
|
||||
public VisualElement Viewport => Q<VisualElement>("Viewport");
|
||||
public VisualElement Container => Q<VisualElement>("Container");
|
||||
public VisualElement ScrollerVertical => Q<VisualElement>("ScrollerVertical");
|
||||
public readonly VisualElement Viewport;
|
||||
public readonly VisualElement Container;
|
||||
public readonly VisualElement ScrollerVertical;
|
||||
|
||||
public UIScrollViewV(VisualElement element, VisualElement canvas, UIDirection direction) : base(element) {
|
||||
public UIScrollViewV(VisualElement element, VisualElement canvas, UIDirection direction = UIDirection.FromTopToBottom) : base(element) {
|
||||
this.canvas = canvas;
|
||||
this.direction = direction;
|
||||
|
||||
if (direction == UIDirection.FromTopToBottom) {
|
||||
// vertical = new UIScroller(ScrollerVertical, canvas, direction);
|
||||
Viewport.style.flexDirection = FlexDirection.Column;
|
||||
}
|
||||
if (direction == UIDirection.FromBottomToTop) {
|
||||
// vertical = new UIScroller(ScrollerVertical, canvas, direction);
|
||||
Viewport.style.flexDirection = FlexDirection.ColumnReverse;
|
||||
}
|
||||
Viewport = element.Children().FirstOrDefault(e => e.name == "Viewport");
|
||||
Container = Viewport.Children().FirstOrDefault(e => e.name == "Container");
|
||||
ScrollerVertical = element.Children().FirstOrDefault(e => e.name == "ScrollerVertical");
|
||||
|
||||
if (direction == UIDirection.FromTopToBottom) { vertical = new UIScrollerV(ScrollerVertical, canvas, UIScrollerV.UIDirection.FromTopToBottom); }
|
||||
if (direction == UIDirection.FromBottomToTop) { vertical = new UIScrollerV(ScrollerVertical, canvas, UIScrollerV.UIDirection.FromBottomToTop); }
|
||||
|
||||
// 设置事件
|
||||
vertical.ValueChanged += (y) => { UpdateValue(y); };
|
||||
|
||||
Viewport.RegisterCallback<WheelEvent>(ViewportWheel);
|
||||
Viewport.RegisterCallback<PointerDownEvent>(DraggerDown);
|
||||
Viewport.RegisterCallback<MouseCaptureEvent>((evt) => isDrag = false);
|
||||
Viewport.RegisterCallback<MouseCaptureEvent>(DraggerUpOrLeave);
|
||||
Viewport.style.flexDirection = direction == UIDirection.FromTopToBottom ? FlexDirection.Column : FlexDirection.ColumnReverse;
|
||||
// 释放
|
||||
canvas.RegisterCallback<PointerUpEvent>((evt) => isDrag = false);
|
||||
canvas.RegisterCallback<PointerLeaveEvent>((evt) => isDrag = false);
|
||||
canvas.RegisterCallback<PointerUpEvent>(DraggerUpOrLeave);
|
||||
canvas.RegisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
|
||||
// 视图原始更新
|
||||
element.generateVisualContent += ElementGenerateVisualContent;
|
||||
}
|
||||
/// <summary> 解绑事件,防止内存泄漏 </summary>
|
||||
public virtual void Dispose() {
|
||||
Viewport.UnregisterCallback<WheelEvent>(ViewportWheel);
|
||||
Viewport.UnregisterCallback<PointerDownEvent>(DraggerDown);
|
||||
Viewport.UnregisterCallback<MouseCaptureEvent>(DraggerUpOrLeave);
|
||||
canvas.UnregisterCallback<PointerUpEvent>(DraggerUpOrLeave);
|
||||
canvas.UnregisterCallback<PointerLeaveEvent>(DraggerUpOrLeave);
|
||||
element.generateVisualContent -= ElementGenerateVisualContent;
|
||||
}
|
||||
/// <summary> 原始更新 </summary>
|
||||
private void ElementGenerateVisualContent(MeshGenerationContext context) {
|
||||
float height = Mathf.Clamp01(Viewport.resolvedStyle.height / Container.resolvedStyle.height);
|
||||
@@ -96,6 +105,10 @@ namespace MuHua {
|
||||
if (value > max) { value = Mathf.Lerp(value, max, Time.deltaTime * 10); }
|
||||
if (original != value) { UpdateValue(value); }
|
||||
}
|
||||
/// <summary> 鼠标松开或离开 </summary>
|
||||
private void DraggerUpOrLeave(EventBase evt) {
|
||||
isDrag = false;
|
||||
}
|
||||
|
||||
/// <summary> 更新状态 </summary>
|
||||
public virtual void Update() {
|
||||
|
||||
Reference in New Issue
Block a user