Files
18xchat/.svn/pristine/f7/f7496f09d42b33b36493de45329f742d8197f123.svn-base
T
2025-07-17 17:18:21 +08:00

208 lines
6.6 KiB
Plaintext
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.
import { _decorator, Button, Component, Enum, Node, Sprite, SpriteFrame, tween, UITransform, v3, Vec3 } from "cc";
import li_Component from "./li_Component";
import ScrollViewList from "./ScrollViewList";
const { ccclass, property, disallowMultiple, menu, executionOrder } = _decorator;
enum SelectedType {
NONE = 0,
TOGGLE = 1,
SWITCH = 2,
}
//列表Item组件 1、此组件须配合List组件使用。(配套的配套的..)
@ccclass
@disallowMultiple()
@menu('自定义控件/ScrollviewList Item')
@executionOrder(-1001) //先于List
export default class ScrollviewListItem extends li_Component {
//选择模式
@property({
type: Enum(SelectedType),
tooltip: '选择模式'
})
selectedMode: SelectedType = SelectedType.NONE;
//被选标志
@property({
type: Node, tooltip: '被选标志',
visible() { return this.selectedMode > SelectedType.NONE; }
})
selectedFlag: Node = null;
//被选择的SpriteFrame
@property({
type: SpriteFrame, tooltip: '被选择的SpriteFrame',
visible() { return this.selectedMode == SelectedType.SWITCH; }
})
selectedSpriteFrame: SpriteFrame = null;
//未被选择的SpriteFrame
_unselectedSpriteFrame: SpriteFrame = null;
//自适应尺寸
@property({
tooltip: '自适应尺寸(宽或高)',
})
adaptiveSize: boolean = false;
//选择
_selected: boolean = false;
set selected(val: boolean) {
this._selected = val;
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;
private uitf: UITransform;
onLoad() {
//有选择模式时,保存相应的东西
if (this.selectedMode == SelectedType.SWITCH) {
let com: Sprite = this.selectedFlag.getComponent(Sprite);
this._unselectedSpriteFrame = com.spriteFrame;
}
this.uitf = this.node.getComponent(UITransform);
}
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(t, 'onClickThis'));
}
if (t.adaptiveSize) {
t.node.on(Node.EventType.SIZE_CHANGED, t._onSizeChange, t);
}
t._eventReg = true;
}
}
_onSizeChange() {
this.list._onItemAdaptive(this.node);
}
/**
* 创建事件
* @param {Component} component 组件脚本
* @param {string} handlerName 触发函数名称
* @param {Node} node 组件所在node(不传的情况下取component.node
* @returns 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 Component.EventHandler();
evt.target = node || component.node;
evt.component = component['comName'];
evt.handler = handlerName;
return evt;
}
showAni(aniType: number, callFunc: Function, del: boolean) {
let num = 0;
let act = tween(this.node);
// let acts: any[];
switch (aniType) {
case 0: //向上消失
// acts = [
// scaleTo(.2, .7),
// moveBy(.3, 0, this.node.height * 2),
// ];
act.to(0.2, {scale: v3(0.7, 0.7, 0.7)})
act.by(0.3, {position: v3(0, this.uitf.height*2)})
num=2;
break;
case 1: //向右消失
// acts = [
// scaleTo(.2, .7),
// moveBy(.3, this.node.width * 2, 0),
// ];
act.to(0.2, {scale: v3(0.7, 0.7, 0.7)})
act.by(0.3, {position: v3(this.uitf.width*2, 0)})
num=2;
break;
case 2: //向下消失
// acts = [
// scaleTo(.2, .7),
// moveBy(.3, 0, this.node.height * -2),
// ];
act.to(0.2, {scale: v3(0.7, 0.7, 0.7)})
act.by(0.3, {position: v3(0, this.uitf.height*-2)})
num=2;
break;
case 3: //向左消失
// acts = [
// cc.scaleTo(.2, .7),
// cc.moveBy(.3, this.node.width * -2, 0),
// ];
act.to(0.2, {scale: v3(0.7, 0.7, 0.7)})
act.by(0.3, {position: v3(this.uitf.width*-2, 0)})
num=2;
break;
default: //默认:缩小消失
// acts = [
// cc.scaleTo(.3, .1),
// ];
act.to(0.3, {scale: v3(0.1, 0.1, 0.1)})
num=1;
break;
}
if (callFunc || del) {
act.call(()=>{
if (del) {
this.list._delSingleItem(this.node);
for (let n: number = this.list.displayData.length - 1; n >= 0; n--) {
if (this.list.displayData[n].id == this.listId) {
this.list.displayData.splice(n, 1);
break;
}
}
}
callFunc();
})
num += 1;
}
if (num > 0){
act.start()
}
}
onClickThis() {
}
}
function scaleTo(arg0: number, arg1: number): any {
throw new Error("Function not implemented.");
}