This commit is contained in:
2025-09-16 19:14:21 +08:00
parent 4e00f2a382
commit d7dcd00b6e
2 changed files with 419 additions and 313 deletions
@@ -3,7 +3,10 @@ import {
Component, Component,
instantiate, instantiate,
Node, Node,
NodeEventType,
ScrollView, ScrollView,
Tween,
UIOpacity,
UITransform, UITransform,
Vec3, Vec3,
view, view,
@@ -34,6 +37,13 @@ export class ChatContentsLayout extends Component {
@property(ScrollView) @property(ScrollView)
private scrollView: ScrollView = null; private scrollView: ScrollView = null;
// 内容透明度组件
private contentOpacity: UIOpacity = null;
// 是否正在按下
private isPressing: boolean = false;
// 长按计时器
private longPressTimer: number = null;
fixMaxWidth: number; fixMaxWidth: number;
protected start(): void { protected start(): void {
@@ -41,7 +51,15 @@ export class ChatContentsLayout extends Component {
this.rBubble.node.active = false; this.rBubble.node.active = false;
this.fixMaxWidth = 730; this.fixMaxWidth = 730;
// 获取父节点的ScrollView组件 // 获取或添加UIOpacity组件到content节点
this.contentOpacity = this.node.getComponent(UIOpacity) || this.node.addComponent(UIOpacity);
// 注册触摸事件
if (this.scrollView && this.scrollView.node) {
this.scrollView.node.on(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.scrollView.node.on(NodeEventType.TOUCH_END, this.onTouchEnd, this);
this.scrollView.node.on(NodeEventType.TOUCH_CANCEL, this.onTouchEnd, this);
}
} }
protected onEnable(): void { protected onEnable(): void {
@@ -251,4 +269,70 @@ export class ChatContentsLayout extends Component {
this.bubbles.push(bubble); this.bubbles.push(bubble);
} }
} }
/**
* 触摸开始事件
*/
private onTouchStart(): void {
// 清除之前的计时器
if (this.longPressTimer) {
clearTimeout(this.longPressTimer);
}
// 设置长按计时器(300ms后触发)
this.longPressTimer = setTimeout(() => {
this.isPressing = true;
// 使用Tween动画平滑调整透明度
Tween.stopAllByTarget(this.contentOpacity);
new Tween(this.contentOpacity)
.to(0.2, { opacity: 50 }) // 调整到约20%透明度
.start();
}, 300);
}
/**
* 触摸结束事件
*/
private onTouchEnd(): void {
// 清除计时器
if (this.longPressTimer) {
clearTimeout(this.longPressTimer);
this.longPressTimer = null;
}
// 如果已经按下,恢复透明度
if (this.isPressing) {
this.isPressing = false;
Tween.stopAllByTarget(this.contentOpacity);
new Tween(this.contentOpacity)
.to(0.2, { opacity: 255 }) // 恢复到100%透明度
.start();
}
}
/**
* 组件销毁时清理资源
*/
protected onDestroy(): void {
// 清理事件监听
if (this.scrollView && this.scrollView.node) {
this.scrollView.node.off(NodeEventType.TOUCH_START, this.onTouchStart, this);
this.scrollView.node.off(NodeEventType.TOUCH_END, this.onTouchEnd, this);
this.scrollView.node.off(NodeEventType.TOUCH_CANCEL, this.onTouchEnd, this);
}
// 清理计时器
if (this.longPressTimer) {
clearTimeout(this.longPressTimer);
this.longPressTimer = null;
}
// 清理延时任务
this.clearDelayedTasks();
// 停止所有动画
if (this.contentOpacity) {
Tween.stopAllByTarget(this.contentOpacity);
}
}
} }
File diff suppressed because it is too large Load Diff