Files
18xchat/assets/Scripts/Main/Common/ScrollviewListItem.ts
T
2025-07-17 17:18:21 +08:00

192 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************
* @doc 列表Item组件.
* 说明:
* 1、此组件须配合List组件使用。(配套的配套的..)
* @end
******************************************/
const { ccclass, property, disallowMultiple, menu, executionOrder } = _decorator;
import { Node, Component, Enum, Sprite, SpriteFrame, tween, _decorator, EventHandler, Tween, Button, UITransform, Vec3 } from 'cc';
import { DEV } from 'cc/env';
import ScrollViewList from './ScrollViewList';
enum SelectedType {
NONE = 0,
TOGGLE = 1,
SWITCH = 2,
}
@ccclass
@disallowMultiple()
@executionOrder(-5001) //先于List
export default class ScrollViewListItem extends Component {
//图标
@property({ type: Sprite, tooltip: DEV ? '图标' : '' })
icon: Sprite = null!;
//标题
@property({ type: Node, tooltip: DEV ? '标题' : '标题'})
title: Node = null!;
//选择模式
@property({
type: Enum(SelectedType),
tooltip: DEV ? '选择模式' : '选择模式'
})
selectedMode: SelectedType = SelectedType.NONE;
//被选标志
@property({
type: Node, tooltip: DEV ? '被选标识' : '被选标识',
visible() { return this.selectedMode > SelectedType.NONE }
})
selectedFlag: Node = null!;
//被选择的SpriteFrame
@property({
type: SpriteFrame, tooltip: DEV ? '被选择的SpriteFrame' : '被选择的SpriteFrame',
visible() { return this.selectedMode == SelectedType.SWITCH }
})
selectedSpriteFrame: SpriteFrame = null!;
//未被选择的SpriteFrame
_unselectedSpriteFrame: SpriteFrame = null!;
//自适应尺寸
@property({
tooltip: DEV ? '自适应尺寸(宽或高)' : '自适应尺寸(宽或高)',
})
adaptiveSize: boolean = false;
//选择
_selected: boolean = false;
set selected(val: boolean) {
this._selected = val;
Tween
if (!this.selectedFlag)
return;
switch (this.selectedMode) {
case SelectedType.TOGGLE:
this.selectedFlag.active = val;
break;
case SelectedType.SWITCH:
let sp: Sprite = this.selectedFlag.getComponent(Sprite)!;
if (sp) {
sp.spriteFrame = val ? this.selectedSpriteFrame : this._unselectedSpriteFrame;
}
break;
}
}
get selected() {
return this._selected;
}
//按钮组件
private _btnCom: any;
get btnCom() {
if (!this._btnCom)
this._btnCom = this.node.getComponent(Button);
return this._btnCom;
}
//依赖的List组件
public list!: ScrollViewList;
//是否已经注册过事件
private _eventReg = false;
//序列id
public listId!: number;
onLoad() {
// //没有按钮组件的话,selectedFlag无效
// if (!this.btnCom)
// this.selectedMode == SelectedType.NONE;
//有选择模式时,保存相应的东西
if (this.selectedMode == SelectedType.SWITCH) {
let com: Sprite = this.selectedFlag.getComponent(Sprite)!;
this._unselectedSpriteFrame = com.spriteFrame!;
}
}
onNodeDestroy() {
let t: any = this;
t.node.off(Node.EventType.SIZE_CHANGED, t._onSizeChange, t);
}
_registerEvent() {
let t: any = this;
if (!t._eventReg) {
if (t.btnCom && t.list.selectedMode > 0) {
t.btnCom.clickEvents.unshift(t.createEvt(this, 'onClickThis'));
}
if (t.adaptiveSize) {
t.node.on(Node.EventType.SIZE_CHANGED, t._onSizeChange, this);
}
t._eventReg = true;
}
}
_onSizeChange() {
this.list._onItemAdaptive(this.node);
}
/**
* 创建事件
* @param {cc.Component} component 组件脚本
* @param {string} handlerName 触发函数名称
* @param {cc.Node} node 组件所在node(不传的情况下取component.node
* @returns cc.Component.EventHandler
*/
createEvt(component: Component, handlerName: string, node: Node = null!) {
if (!component || !component.isValid)
return;//有些异步加载的,节点以及销毁了。
component['comName'] = component['comName'] || component.name.match(/\<(.*?)\>/g).pop().replace(/\<|>/g, '');
let evt = new EventHandler();
evt.target = node || component.node;
evt.component = component['comName'];
evt.handler = handlerName;
return evt;
}
showAni(aniType: number, callFunc: Function, del: boolean) {
let t: any = this;
let twe: Tween<Node>;
let ut: UITransform = t.node.getComponent(UITransform);
switch (aniType) {
case 0: //向上消失
twe = tween(t.node)
.to(.2, { scale: new Vec3(.7, .7) })
.by(.3, { position: new Vec3(0, ut.height * 2) });
break;
case 1: //向右消失
twe = tween(t.node)
.to(.2, { scale: new Vec3(.7, .7) })
.by(.3, { position: new Vec3(ut.width * 2, 0) });
break;
case 2: //向下消失
twe = tween(t.node)
.to(.2, { scale: new Vec3(.7, .7) })
.by(.3, { position: new Vec3(0, ut.height * -2) });
break;
case 3: //向左消失
twe = tween(t.node)
.to(.2, { scale: new Vec3(.7, .7) })
.by(.3, { position: new Vec3(ut.width * -2, 0) });
break;
default: //默认:缩小消失
twe = tween(t.node)
.to(.3, { scale: new Vec3(.1, .1) });
break;
}
if (callFunc || del) {
twe.call(() => {
if (del) {
t.list._delSingleItem(t.node);
for (let n: number = t.list.displayData.length - 1; n >= 0; n--) {
if (t.list.displayData[n].id == t.listId) {
t.list.displayData.splice(n, 1);
break;
}
}
}
callFunc();
});
}
twe.start();
}
onClickThis() {
this.list.selectedId = this.listId;
}
}