import SScript from "./SScript"; import Label = Laya.Label; export default class SLabel extends SScript{ static PLACE_HOLDER_REG = new RegExp('{[0-9]}', 'g'); /** @prop {name:useEllipsis, tips:"是否在文本长度超出宽度后显示省略号", type:bool} */ useEllipsis:boolean = false; /** @prop {name:ellipsisString, tips:"省略号字符串,默认为'...''", type:string} */ ellipsisString:string = '...'; /** @prop {name:usePlaceholder, tips:"是否使用占位符,一旦使用占位符后,对宿主Label的text设置就只会影响占位符部分,设置text时每个占位符字符串之间需要以'|'符号进行分隔。占位符为{n}的形式,n是从1开始的递增索引号。", type:bool} */ usePlaceholder:boolean = false; /** @prop {name:defaultPlaceHolderString, tips:"占位符默认文本", type:string} */ defaultPlaceHolderString:string; protected $label:Label; private _originalStr:string; onAwake(){ if(this.owner instanceof Label) { this.$label = this.owner; if(this.useEllipsis){ this.$label.overflow = Laya.Text.HIDDEN; //Laya.Text的_parseLine方法可以计算出最终需要渲染的字符串有哪些 let overrideFucName = '_parseLine'; let overrideTarget = this.$label['_tf']; let origiFuc = overrideTarget[overrideFucName]; let ellipsisString = this.ellipsisString; //重载_parseLine方法并在执行其原始方法后修改最终需要渲染的字符串 overrideTarget[overrideFucName] = function(line){ origiFuc.apply(this, arguments); //最终将渲染的字符串均存于_lines数组中,修改其最后一行字符串的最后几个字为省略号即可 let lastLine:string = this._lines[this._lines.length - 1]; if(lastLine && (line != lastLine)){ for(let i = 1; i < lastLine.length; i++) { let tempStr = lastLine.substr(lastLine.length - i); if(this._getTextWidth(tempStr) > this._getTextWidth(ellipsisString)) { lastLine = lastLine.substring(0, lastLine.length - i) + ellipsisString; break; } } this._lines[this._lines.length - 1] = lastLine; } }; } if(this.usePlaceholder) { this.$label['textFilter'] = (value)=>{ if(this._originalStr) { value = value ? value + '' : ''; let ary = value.split('|'); value = this._originalStr; let match = this._originalStr.match(SLabel.PLACE_HOLDER_REG); for(let i = 0; i < ary.length; i++) { if(match[i]) { value = value.replace(match[i], ary[i]); } } } return value; } let origiText = this.$label.text; //测试起始状态宿主text属性中是否含有占位符,若有,则将此时的text存起来 if(origiText.match(SLabel.PLACE_HOLDER_REG)) { this._originalStr = origiText; if(this.defaultPlaceHolderString)this.$label.text = this.defaultPlaceHolderString; } } } else { console.error('请保证SLabel的宿主是Label类型'); } } }