其實(shí)本質(zhì)是通過(guò) .characterCountVisible 參數(shù)來(lái)獲取顯示出來(lái)的字符串長(zhǎng)度村怪,和實(shí)際要顯示的文字字符串長(zhǎng)度的比較,超過(guò)長(zhǎng)度的話,最后的字符替換成“...”
image.png
需要注意一點(diǎn),因?yàn)榫幋a方式的不同,在使用 UTF-8 字符編碼的情況下右核,一個(gè)中文字符一般占 3 個(gè)字節(jié)柿冲。實(shí)際上“測(cè)試文本”的string.len()結(jié)果是12,但是 .characterCountVisible取出來(lái)的結(jié)果是4.所以需要進(jìn)行一次轉(zhuǎn)換
function TasksTopTipsView:SetTextWithEllipsis(text, rect, value)
local generator = CS.UnityEngine.TextGenerator()
local settings = text:GetGenerationSettings(rect.size)
generator:Populate(value, settings)
local characterCountVisible = generator.characterCountVisible
if string.utf8len(value) ~= string.len(value) then
characterCountVisible = characterCountVisible*3
end
if string.len(value) > characterCountVisible then
text.text = string.sub(value, 0, characterCountVisible - 3) .. "..."
else
text.text = value
end
end
--計(jì)算 UTF8 字符串的長(zhǎng)度瘩欺,每一個(gè)中文算一個(gè)字符
function string.utf8len(input)
local len = string.len(input)
local left = len
local cnt = 0
local arr = {0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}
while left ~= 0 do
local tmp = string.byte(input, -left)
local i = #arr
while arr[i] do
if tmp >= arr[i] then
left = left - i
break
end
i = i - 1
end
cnt = cnt + 1
end
return cnt
end