Android開發(fā)解決字符對齊問題方法
前言
其實(shí)很多人都會碰到文本不對齊,文字不對齊的情況,但是只要不明顯被提出,一般都會置之不理。我關(guān)注這個(gè)問題是因?yàn)橛袀€(gè)老哥問我倒計(jì)時(shí)的時(shí)候,10以上和10以下會出現(xiàn)寬度變化,因?yàn)?位數(shù)變1位數(shù)確實(shí)會變化很大,有的人會說1位數(shù)的時(shí)候前面補(bǔ)零,這也是一個(gè)方法,還有人說,你設(shè)置控件的寬度固定不就行了嗎?其實(shí)還真不好,即便你寬度固定,你的文字內(nèi)容也是會變的。
所以我就去想這個(gè)問題,雖然不是一個(gè)什么大問題,但當(dāng)你去探究,確實(shí)能收獲一些不一樣的東西。
基礎(chǔ)概念
首先回顧一些基礎(chǔ)的東西。
1字節(jié)是8位,所以1字節(jié)能有256種組合,說到這個(gè),就能聯(lián)系出ASCII碼,ASCII碼都熟吧,就是數(shù)字和字母啊這些。然后ASCII碼的定義的符號,是沒有到256的,這個(gè)也很容易理解,去看看ASCII碼的表就知道了。所以,ASCII碼中的符號,都能用1個(gè)字節(jié)表示。
但是你的漢字是沒辦法用256表示的,我們中華文化博大精深,不是區(qū)區(qū)256能容納得下的。所以漢字得用2個(gè)字節(jié)表示,甚至3個(gè)字節(jié)表示。然后emoji好像是要占3個(gè)字節(jié)還是4個(gè)字節(jié)得,這個(gè)我記得不太清了。而且不同的編碼占的也不同。
回顧一下這些內(nèi)容主要是為了找找感覺。
半角和全角
這個(gè)相信大家也有點(diǎn)了解,我們平時(shí)用輸入法的時(shí)候就能進(jìn)行半角全角的切換。
簡單來說,全角em是指一個(gè)字符占用兩個(gè)標(biāo)準(zhǔn)字符位置,半角en是指一個(gè)字符占用一個(gè)標(biāo)準(zhǔn)字符的位置。注意這里說的是占多少的位置,和上面提的字節(jié)沒關(guān)系,不是說你2個(gè)字節(jié)就占2個(gè)位置,1個(gè)字節(jié)只占一個(gè)位置。
但是一般半角和圓角都是針對ASCII碼里面的符號的(這個(gè)我沒找到相應(yīng)的概念,我是根據(jù)現(xiàn)象推導(dǎo)的)
所以先來看看直接設(shè)置半角和全角的效果

上面是半角,下面是全角,能明顯看出來,中文的半角和全角都是占了兩個(gè)標(biāo)準(zhǔn)字符的位置,而ASCII碼中的符號,在半角的情況下是占一個(gè),在全角的情況下是占兩個(gè)。
漢字是這樣,但是我在找資料的時(shí)候看到一個(gè)挺有意思的場景。就是日文,因?yàn)榫幋a方式,會出現(xiàn)部分日文的半角效果和全角效果是不同的??梢詤⒖歼@個(gè)老哥寫的 http://www.dhdzp.com/article/276739.htm ,用的是JIS C 6220這種編碼方式。
那說到這里,其實(shí)你就已經(jīng)有一個(gè)概念了,數(shù)字中,每個(gè)數(shù)字在半角情況下都是占一個(gè)字符(我這里說占一個(gè)坑位可能會更好理解),默認(rèn)變量輸出都是半角,那兩位數(shù),就占兩個(gè)坑位。所以要讓1位數(shù)的顯示和兩位數(shù)的相同,讓1位數(shù)占兩個(gè)坑位不就行了嗎,把1位數(shù)轉(zhuǎn)成全角就行了。

看我這的效果,藍(lán)色的區(qū)域就是全角的效果,看得出是比之前好過一些,但也沒辦法完全等于兩個(gè)半角數(shù)字的寬度,還是差了點(diǎn)意思。
空格
除了用半角全角的思路去處理,還有辦法嗎?當(dāng)然有了,發(fā)揮想象力想想,要實(shí)現(xiàn)1位數(shù)和2位數(shù)對齊,我可以給1位數(shù)的兩邊加上空格,不就行了嗎,所以這空格也是有講究滴。
我們可以來看看Unicode中有哪些空格(只列舉部分):
- U+0020:ASCII空格
- U+00A0:不間斷空格
- U+2002:EN空格
- U+2003:EM空格
- U+2004:?EM空格
- U+2005:¼EM空格
- U+2006:?EM空格
- U+2007:數(shù)字空格
- U+2009:窄空格
- U+3000:文字空格
如果先了解了半角你就知道什么是en,什么是em,看這些的時(shí)候也會更有感覺。那這么多空格,我怎么知道哪個(gè)合適?那合不合適,試試不就知道了嗎,這不就和談女朋友一樣,去試試嘛

首先看到ASCII空格是合適的,會不會有人看到這里有答案就跑了 ,然后還有幾個(gè)看著也相近,我們可以單獨(dú)拿出來比一下。U+2004、U+2005和U+2009

發(fā)現(xiàn)都不合適,那這個(gè)代碼具體要怎么加呢,其實(shí)也很簡單,直接寫\u0020就行,比如我這里的布局就是這樣
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/blue"
android:textColor="#000000"
android:text="\u00206\u0020"
android:textSize="26sp"
/>其它
上面都是通過編碼的方向去解決這個(gè)問題,那還有其它方式嗎?當(dāng)然又有,其實(shí)一開始就有人想說了,用幾個(gè)textview去拼接,然后設(shè)置數(shù)字的textview固定寬度并且內(nèi)容居中。
這當(dāng)然可以。比如“倒計(jì)時(shí)30秒”這段文字,拆成3個(gè)textview,讓第二個(gè)textview固定寬度并且內(nèi)容居中,也能實(shí)現(xiàn)這個(gè)效果,但是這實(shí)現(xiàn)方式也太......,所以需要去探索不同的方式去處理。
那繪制可以嗎,我不用textview,我自定義一個(gè)view然后畫上去,我自己畫的話能很好把控各種細(xì)節(jié)的處理。我倒是覺得這是一個(gè)好的主意。這是通過繪制的方式去解決這個(gè)問題。
所以從這里可以看出,其實(shí)解決這個(gè)問題的方式有很多,可以從不同的角度去處理。
以上就是Android開發(fā)解決字符對齊問題方法的詳細(xì)內(nèi)容,更多關(guān)于Android開發(fā)字符對齊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果
這篇文章主要介紹了Android中自定義View實(shí)現(xiàn)圓環(huán)等待及相關(guān)的音量調(diào)節(jié)效果,邏輯非常簡單,或許繪圖方面更加繁瑣XD 需要的朋友可以參考下2016-04-04
使用RecyclerView實(shí)現(xiàn)水平列表
這篇文章主要為大家詳細(xì)介紹了使用RecyclerView實(shí)現(xiàn)水平列表,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
Flutter實(shí)現(xiàn)資源下載斷點(diǎn)續(xù)傳的示例代碼
在項(xiàng)目開發(fā)中,特別是C端的產(chǎn)品,資源下載實(shí)現(xiàn)斷點(diǎn)續(xù)傳是非常有必要的。今天我們不講過多原理的知識,分享下簡單實(shí)用的資源斷點(diǎn)續(xù)傳2022-07-07
Android中TextView局部變色功能實(shí)現(xiàn)
這篇文章給大家詳細(xì)講解了一下Android中TextView實(shí)現(xiàn)部分文字不同顏色的功能實(shí)現(xiàn)過程,有這方面需要的朋友們一起學(xué)習(xí)下吧。2017-12-12
詳細(xì)介紹Android-Room數(shù)據(jù)庫的使用
這篇文章主要介紹了詳細(xì)介紹Android-Room數(shù)據(jù)庫的使用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
札記:android手勢識別功能實(shí)現(xiàn)(利用MotionEvent)
現(xiàn)在手勢識別的應(yīng)用已經(jīng)很廣泛了。本篇文章主要介紹了android手勢識別功能實(shí)現(xiàn),具有一定的參考價(jià)值,有興趣的可以了解一下。2016-11-11
android studio集成unity導(dǎo)出工程的實(shí)現(xiàn)
本文主要介紹了android studio集成unity導(dǎo)出工程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05

