TextView-不等字數兩端對齊

前言

~


項目截圖

最近同事在項目中遇到,TextView文字兩端對齊的問題,就如同上圖的效果5個字和4個字的文字首尾對齊。當然上圖的實現方式是承載的H5頁面,并不是原生的TextView。可是這個問題一直困擾著我,想試試用原生的TextView能不能做出這個效果,于是就有了今天這篇文章。


1.初步實現效果

~


原生TextView實現對齊效果

效果還不錯吧,使用起來也是非常的簡單:

tv1.setText(AlignedTextUtils.formatText("手 機 號"));
tv2.setText(AlignedTextUtils.formatText("密   碼"));
tv3.setText("再次確認密碼");
tv4.setText(AlignedTextUtils.formatText("個性簽名"));
tv5.setText(AlignedTextUtils.formatText("編不下去了"));
特別說明:文字中的“空格”一定要是全角模式下的空格,因為全角模式下漢子,數字,符號等所占比例是一致的。

2.關鍵工具類

~ 目前這個工具類支持2-6個數字的對齊(如果你有其他需求可以參照這個思路自行編寫)

/** 
  * 不同文字數目2端對齊工具類 (支持2-6個數字) 
  * 
  * @author yuhao 
  * @time 2016年6月28日 */
public class AlignedTextUtils {   

 private static int n = 0;// 原Str擁有的字符個數     
 private static SpannableString spannableString;
 private static double multiple = 0;// 放大倍數    

/**     
  * 對顯示的字符串進行格式化 比如輸入:出生年月 輸出結果:出正生正年正月     
  */    
public static String formatStr(String str) {       
      if (TextUtils.isEmpty(str)) {            
             return "";        
      }        
      n = str.length();        
      if (n >= 6) {            
            return str;        
      }       
      StringBuilder sb = new StringBuilder(str);       
      for (int i = n - 1; i > 0; i--) {            
            sb.insert(i, "正");        
       }        
       return sb.toString();    
      }    

     /**     
       * 對顯示字符串進行格式化 比如輸入:安正卓正機正器正人 輸出結果:安 卓 機 器 人    
       *     
       * @param str     
       * @return     */    
 public static SpannableString formatText(String str){        
    if (TextUtils.isEmpty(str)) {            
    return null;        
    }        
    str = formatStr(str);        
    if (str.length()<=6){            
    return null;        
    }        
    spannableString = new SpannableString(str);           
    switch (n) {            
    case 2:                
         multiple = 4;                
      break;            
    case 3:                
         multiple = 1.5;                
       break;            
    case 4:                
        multiple =   0.66666666666666666666666666666666667;                   
      break;            
    case 5:                
        multiple = 0.25;                
      break;            
    default:                
       break;        
    }        
    for (int i = 1; i < str.length(); i = i + 2) 
   {            
    spannableString.setSpan(new RelativeSizeSpan((float) multiple), i, i + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);            
    spannableString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), i, i + 1,  Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        
   }       
   return spannableString;    
}
}

3.實現思路詳解

~ TextView自帶有行間距可是并沒有字間距,所以我想到了利用SpannableString的RelativeSizeSpan和ForegroundColorSpan以及StringBuilder來模擬字間距的效果,相信看了下面這張圖,你就基本明白實現的原理了

原理圖

步驟一:轉換字符串

~
利用formatStr(String str)方法來格式化字符串,每隔一個字符插入一個字符,上面的工具類我寫的是“正”字,是為了顯示的更清楚。而這個“正”字的作用就是為了稱當字間距的作用。

代碼:

tv1.setText(AlignedTextUtils.formatStr("安卓初學者"));

效果:

轉換字符串后的效果

步驟二:修改“字間距”大小

~
經過上一步之后我們需要做的就是縮放“正”字,那么到底應該縮放多少呢?

抽象派的圖片

如上圖,雖說丑了點,但是可以明顯看出5個字的字符串是由6個字的字符串多出來的那個字符平分成4份,所以每一個字符的縮放比為1/4倍.
以此類推可以得出一個公式縮放倍數:

(6-n)/(n-1)

代碼:

spannableString.setSpan(new RelativeSizeSpan((float) multiple), i, i + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);     

效果:

縮放比例后的效果

步驟三:修改“字間距”顏色

~
隱藏字間距,將顏色設置和背景一致即可。

代碼:

spannableString.setSpan(new ForegroundColorSpan(Color.TRANSPARENT), i, i + 1,        Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

效果:

最終效果

4.后記

  • 這個工具類,僅僅是提供一個思路,也可能存在很多問題,如果問題歡迎聯系我,大家一起完善。
  • 目前的問題:23個字的時候,由于縮放倍數大于1,造成了文本框變大問題。解決方法是:用全角字符的“空格”將23個字的字符轉換成5個字的字符
  • 如果不是很了解SpannableString可以參考碼農小阿飛《用SpannableString打造絢麗多彩的文本顯示效果》
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,489評論 0 17
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,155評論 4 61
  • 人生若只如初見,何不,不忘初心,勇往直前。永遠記得剛來時候的心態,永遠保持知足,奮進的狀態。
    慕月清閱讀 314評論 0 0
  • 這幾天真是心浮氣躁,什么都不著調,特別是大寶,怎么養孩子那么難啊,調皮,不聽話,偶爾還會反抗,總是觸碰大人...
    晴冰閱讀 227評論 0 0
  • 人生的樂趣絕對不是嫁一個老公,生一個孩子! 收快遞的感覺太好了,怪不得有些女人會網購成癮。不過我自認為是屬于理性消...
    琰言閱讀 100評論 0 0