如何實(shí)現(xiàn)EditText的TextSize和TextSizeHint大小不一致的效果

需求

在做登錄頁面的時(shí)候,有個(gè)手機(jī)號(hào)碼輸入框,沒有填寫手機(jī)號(hào)時(shí)需要顯示hint為“請(qǐng)輸入手機(jī)號(hào)碼”。

ok這個(gè)需求沒有問題,但是設(shè)計(jì)小哥設(shè)計(jì)出來的效果,手機(jī)號(hào)碼顯示的字體和hint的字體大小不一致??。∈謾C(jī)號(hào)碼顯示的字體時(shí)22sp,hint字體顯示的是17sp。

我尼瑪,大家都知道 EditText只有一個(gè)屬性“textSize”設(shè)置字體大小,現(xiàn)在兩個(gè)字體不一致,我該如何是好。。。設(shè)計(jì)不懂開發(fā)者的悲傷,為了實(shí)現(xiàn)這個(gè)效果,我只能搞點(diǎn)歪門邪道的邏輯了。

沒有輸入時(shí)的樣式
輸入后的樣式

開發(fā)

一開始我準(zhǔn)備監(jiān)聽EditText的輸入變化,如果EditText輸入為空,那么用代碼動(dòng)態(tài)的設(shè)置textSize為17sp,否則設(shè)置為22sp。

這個(gè)邏輯簡單,一會(huì)的功夫就完成了,插上手機(jī)運(yùn)行一看,我去!光標(biāo)也會(huì)隨著字體大小變長變短,尼瑪。。。忘了光標(biāo)這回事了。這可不行,這個(gè)效果設(shè)計(jì)小哥絕對(duì)不會(huì)接受的。

為了讓光標(biāo)不變,字體大小我寫死成了22sp,現(xiàn)在還是想想怎么改變hint字體的大小吧。仔細(xì)研究了一下EditText的setHint方法,發(fā)現(xiàn)它是父類TextView的方法,參數(shù)是CharSequence,是CharSequence,CharSequence,嗯。。。有門兒了!試試SpannableString吧!

百度了一下SpannableString怎么改變字體大小,找到了,可以設(shè)置AbsoluteSizeSpan,這下厲害了,雖然我設(shè)置的textSize是22sp,但是我用AbsoluteSizeSpan把hint的字體設(shè)置成了17sp。

插上手機(jī)運(yùn)行一看,沒毛??!

BUG

提交測試后,測試小哥給我反饋這塊UI有毛病,說光標(biāo)會(huì)變大變小。不對(duì)呀,我開發(fā)的時(shí)候?yàn)榱私鉀Q這個(gè)問題還耽誤了很長時(shí)間呢。我不信,插上我的手機(jī)運(yùn)行一看,沒毛病。后來恍然大悟,這個(gè)是機(jī)型適配問題。

測試小哥拿的是小米手機(jī),我用的是華為手機(jī),小米手機(jī)會(huì)有光標(biāo)變大變小這個(gè)問題。

分析

我設(shè)置的字體大小是22sp,沒有改動(dòng),為什么光標(biāo)會(huì)變大變小呢?從代碼上看,只有SpannableString會(huì)對(duì)這塊有影響。我試著把AbsoluteSizeSpan設(shè)置成22sp,發(fā)現(xiàn)光標(biāo)正常了。我再嘗試著把hint的第一個(gè)字設(shè)置成22sp,后面的字設(shè)置成17sp,發(fā)現(xiàn)也沒有問題,但是第一個(gè)字和后面的字大小不一致,好難看。

只有在小米系統(tǒng)上有這個(gè)問題。我猜想小米系統(tǒng)畫蛇添足,對(duì)這一塊進(jìn)行了優(yōu)化,光標(biāo)的長短小米考慮到了hint第一個(gè)字符的AbsoluteSizeSpan設(shè)置的大小,我欲哭無淚。

我嘗試著把hint的第一個(gè)字符設(shè)置成空格,大小為22sp,其他的字設(shè)置成17sp,運(yùn)行一看“請(qǐng)輸入手機(jī)號(hào)碼”提示整體向后移動(dòng)了,也不好看。我想要是有一個(gè)字符沒有長度,不會(huì)在屏幕上展示出來就好了,這樣hint看起來就不會(huì)往后移動(dòng),而且我還可以把第一個(gè)字符設(shè)置成22sp,光標(biāo)也就不會(huì)變大變小了。

對(duì)了,我記得有一個(gè)空字符的東西,百度一看‘\0’就代表空字符。我把字符串改成“\0請(qǐng)輸入手機(jī)號(hào)碼”,再用AbsoluteSizeSpan把“請(qǐng)輸入手機(jī)號(hào)碼”設(shè)置成了17sp,運(yùn)行起來一看,完美!

以前上大學(xué)的時(shí)候?qū)W過ASCII碼里面第一個(gè)就是空字符,想著這玩意有啥用。今天還真的用上了!

總結(jié)

  • TextView的setHint參數(shù)是CharSequence,也就意味著可以使用SpannableString來實(shí)現(xiàn)各種騷樣式。
  • 華為、小米的光標(biāo)長度處理邏輯不一樣。
  • 空字符('\0')的妙用


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容