1. 程式人生 > >解決TextView排版自動換行問題

解決TextView排版自動換行問題

justified實現Textview和Edittext文字左右對齊 
https://github.com/programingjd/justified

http://blog.sina.com.cn/s/blog_73615d370100zpt5.html

今天忽然發現android專案中的文字排版參差不齊的情況非常嚴重,不得不想辦法解決一下。經過研究之後,終於找到了textview自動換行導致混亂的原因了----半形字元與全形字元混亂所致!一般情況下,我們輸入的數字、字母以及英文標點都是半形,所以佔位無法確定。它們與漢字的佔位大大的不同,由於這個原因,導致很多文字的排版都是參差不齊的。對此我找到了兩種辦法可以解決這個問題: 


1. 將textview中的字元全形化。即將所有的數字、字母及標點全部轉為全形字元,使它們與漢字同佔兩個位元組,這樣就可以避免由於佔位導致的排版混亂問題了。 半形轉為全形的程式碼如下,只需呼叫即可。 
Java程式碼  收藏程式碼
  1. /** 
  2.      * 半形轉換為全形 
  3.      *  
  4.      * @param input 
  5.      * @return 
  6.      */  
  7.     public static String ToDBC(String input) {  
  8.         char[] c = input.toCharArray();  
  9.         for (int i = 0
    ; i < c.length; i++) {  
  10.             if (c[i] == 12288) {  
  11.                 c[i] = (char32;  
  12.                 continue;  
  13.             }  
  14.             if (c[i] > 65280 && c[i] < 65375)  
  15.                 c[i] = (char) (c[i] - 65248);  
  16.         }  
  17.         return new String(c);  
  18.     }  

2. 去除特殊字元或將所有中文標號替換為英文標號。利用正則表示式將所有特殊字元過濾,或利用replaceAll()將中文標號替換為英文標號。則轉化之後,則可解決排版混亂問題。 
Java程式碼  收藏程式碼
  1. /** 
  2.      * 去除特殊字元或將所有中文標號替換為英文標號 
  3.      *  
  4.      * @param str 
  5.      * @return 
  6.      */  
  7.     public static String stringFilter(String str) {  
  8.         str = str.replaceAll("【""[").replaceAll("】""]")  
  9.                 .replaceAll("!""!").replaceAll(":"":");// 替換中文標號  
  10.         String regEx = "[『』]"// 清除掉特殊字元  
  11.         Pattern p = Pattern.compile(regEx);  
  12.         Matcher m = p.matcher(str);  
  13.         return m.replaceAll("").trim();  
  14.     }  

解決之前層次不齊的排版截圖: 



解決之後的整齊排版,如下圖: 




文字自動換行原理:文字超出控制元件寬度後,自動換到下一行繪製。 
實現程式碼: 
Java程式碼  收藏程式碼
  1. protected void onDraw(Canvas canvas) {  
  2.         FontMetrics fm = mPaint.getFontMetrics();  
  3.     float baseline = fm.descent - fm.ascent;   
  4.     float x = 0;  
  5.     float y =  baseline;  //由於系統基於字型的底部來繪製文字,所有需要加上字型的高度。  
  6.     String txt = getResources().getString(com.orgcent.demo.R.string.hello);  
  7.     //文字自動換行  
  8.     String[] texts = autoSplit(txt, mPaint, getWidth() - 5);  
  9.     System.out.printf("line indexs: %s\n", Arrays.toString(texts));  
  10.     for(String text : texts) {   
  11.         canvas.drawText(text, x, y, mPaint);  //座標以控制元件左上角為原點  
  12.         y += baseline + fm.leading; //新增字型行間距  
  13.     }  
  14. }  

Java程式碼  收藏程式碼
  1. /** 
  2.  * 自動分割文字 
  3.  * @param content 需要分割的文字 
  4.  * @param p  畫筆,用來根據字型測量文字的寬度 
  5.  * @param width 最大的可顯示畫素(一般為控制元件的寬度) 
  6.  * @return 一個字串陣列,儲存每行的文字 
  7.  */  
  8. private String[] autoSplit(String content, Paint p, float width) {  
  9.     int length = content.length();  
  10.     float textWidth = p.measureText(content);  
  11.     if(textWidth < = width) {  
  12.         return new String[]{content};  
  13.     }  
  14.     int start = 0, end = 1, i = 0;  
  15.     int lines = (int) Math.ceil(textWidth / width); //計算行數  
  16.     String[] lineTexts = new String[lines];  
  17.     while(start < length) {  
  18.         if(p.measureText(content, start, end) > width) { //文字寬度超出控制元件寬度時  
  19.             lineTexts[i++] = (String) content.subSequence(start, end);  
  20.             start = end;  
  21.         }  
  22.         if(end == length) { //不足一行的文字  
  23.             lineTexts[i] = (String) content.subSequence(start, end);  
  24.             break;  
  25.         }  
  26.         end += 1;  
  27.     }  
  28.     return lineTexts;  
  29. }  


相關推薦

解決TextView排版自動問題

justified實現Textview和Edittext文字左右對齊 https://github.com/programingjd/justifiedhttp://blog.sina.com.cn/s/blog_73615d370100zpt5.html今天忽然發現and

TextView英文自動解決方法

TextView元件 遇到一個問題: 想將【TP-LINK_XXXXXXX】已ellipsize="end'的方式展示一部分,設定 android:layout_width="400px" android:ellipsize="end" android:maxLines=

TextView取消自動並設定水平滾動

      假如需要顯示一段程式碼,通常程式碼一行的長度超出了手機螢幕的寬度,這時候TextView預設會選擇自動換行,程式碼由一行變成了兩行,很不美觀。       所以,這篇文章記錄如何取消自動換行並且設定TextView為水平滾動。 佈局程式碼: <Tex

textview自動顯示文字內容

在專案中經常會遇到長文字內容,也就是textview一行顯示不全的問題,這個時候就需要textview中的文字內容能夠自動換行,來解決文字內容過長導致的一行無法完全顯示的問題。(如下圖) 基本的設定:android:ellipsize  = “none”         

解決eclipse的自動問題

安裝方法:使用Eclipse 的自動升級功能,選單欄選Help→install new Software然後按照提示進行安裝完成就可以了裝完後在程式碼編輯介面點右鍵,會出現“Word Warp ”屬性,

Android 自定義View 解決 TextView 自動排版不整齊

第一次寫東西,內心小緊張,又不知道怎麼寫,儘量把遇到的問題和解決思路說清楚,寫的不好請見諒。 需求 專案有一個需求,很簡單,就是一個recyclerview,item裡面是兩個textview。一個TextView顯示的字串包含圓角、半形和中、英文以及數字。 想起來

解決TextView自動

Android開發中會經常遇到TextView自動切行的情況,解決辦法有兩種: 1,把所有字母、標點、符號、數字全部轉換成全形字元,讓其與漢字同樣佔用兩個位元組。 2,把所有字元,標點,符號換成英文符

Android TextView自動文字排版參差不齊的原因

轉:http://niufc.iteye.com/blog/1729792 今天專案沒什麼進展,公司後臺出問題了。看了下剛剛學習Android時的筆記,發現TextView會自動換行,而且排版文字參差不齊。查了下資料,總結原因如下: 1、半形字元與全形字元混亂所致

TextView排版混亂或自動

在TextView顯示文字的時候,我們經常會遇到自動換行後混亂的情況,這種情況是因為我們載入文字的時候沒注意全形和半形或是中英字元。 一般我們輸入數字、字母以及英文的時候都是半形,所以不會出現混

android textview 自動 整齊排版

在網上找了很久的程式碼終於找到了,經過測試,可以使用,先記錄下來,以便以後使用。先上實驗的效果圖 圖上有兩個textview,不同之處請看下文。 以下是轉載的原文: 一、問題在哪裡? textview顯示長文字時會進行自動折行,如果遇到一些特殊情況,自動折行會杯

JustifyTextView 解決TextView中英文混排自動的問題

        最近在做著一個專案,裡邊會顯示很長的一段文字,但是這些文字並不會整齊地排列,遇到文字中帶有中英文時,果斷給我換行了,好無語..接著就是不斷地百度百度,找到了一堆一兩年前的東西,不是叫你半形轉全形,就是中文符號轉英文符號,還有一些自定義TextView的試過了

input不支援自動解決辦法

textarea與input input不支援換行; textarea: 1.支援換行; 2.左邊字型要想跑向左上角需要加程式碼; <textarea name="" id="" cols="" rows="" style="vertical-align:top;out

解決textarea不會自動的問題

用html的textarea標籤編輯錄入資料或文字的時候,按enter鍵換行錄入儲存,但是當重新從伺服器讀取資料的時候發現不會換行了,Google之後終於發現了原因並和解決方法 原因: 當在前端錄入資料的時候,按enter換行其實該換行符是“\n”,那麼在進行讀寫的時候都是

Androi實戰—EidtText和TextView顯示指定數,內容過長自動問題

EidtText和TextView中內容過長的話自動換行,使用android:ellipsize與android:singleine可以解決,使只有一行。使用android:maxLines可設定最大行數。

Textview 設定字時,如果字數很多讓text 自動

/*** * * @param input * @return */ public static String ToDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i <

textView 自動, 可以文字內容動態移動

-(void)textViewDidChange:(UITextView *)textView{     //部落格園-FlyElephant static CGFloat maxHeight = 95;     CGRect frame = textView.frame;             CGS

div中英文無法自動解決辦法

在一個設定好寬度的div中,當我們輸入的中文文字長度超過了設定寬度時,會自動換到下一行。 但是,如果輸入的是英文字母,那麼,無論你div設定寬度為多少,英文字母都是不換行直接在同一行輸出,導致div的寬度遠遠超出設定的大小。 原因:這是因為div中,英文字母之間沒有空格

C# WinForm 中Label自動 解決方法

在TableLayoutPannel中放著一些Label 如果把Label的AutoSize屬性設成True的話,文字超過label長度時就會自動增加,直到後面的字出窗體以外 設定成False時,一旦到達Label的長度,後面的字元也就顯示不出來了 經過我的多番實踐,最

js獲取TextArea每一行字串(包括自動符)的解決方案

當TextArea開啟自動換行時,通過同步提交可以在後臺獲取到自動換行符,但是如果通過js讀取進行非同步提交時,卻無法獲取到自動換行符。這裡先給出兩種半吊子解決方案: 1 利用IE的createTextRange可以通過移動擴充套件游標直到內容超出TextArea寬度時結束,該方法不支援跨瀏覽

解決Java7下JTextPane不能自動的問題

Java7自帶的JTextPane存在一個問題。我們知道預設情況下,如果JTextPane所在的JScrollPane禁止水平滾動條出現時,JTextPane是具備基於單詞(Word)為最小單位的自動換行功能的。對於中文而言,最小單位就是一個漢字;對於英文或拉丁語言而言,就