justified實(shí)現(xiàn)Textview和Edittext文字左右對(duì)齊
https://github.com/programingjd/justified
http://blog.sina.com.cn/s/blog_73615d370100zpt5.html
今天忽然發(fā)現(xiàn)android項(xiàng)目中的文字排版參差不齊的情況非常嚴(yán)重,不得不想辦法解決一下。經(jīng)過(guò)研究之后,終于找到了textview自動(dòng)換行導(dǎo)致混亂的原因了----半角字符與全角字符混亂所致!一般情況下,我們輸入的數(shù)字、字母以及英文標(biāo)點(diǎn)都是半角,所以占位無(wú)法確定。它們與漢字的占位大大的不同,由于這個(gè)原因,導(dǎo)致很多文字的排版都是參差不齊的。對(duì)此我找到了兩種辦法可以解決這個(gè)問(wèn)題:
1. 將textview中的字符全角化。即將所有的數(shù)字、字母及標(biāo)點(diǎn)全部轉(zhuǎn)為全角字符,使它們與漢字同占兩個(gè)字節(jié),這樣就可以避免由于占位導(dǎo)致的排版混亂問(wèn)題了。 半角轉(zhuǎn)為全角的代碼如下,只需調(diào)用即可。
2. 去除特殊字符或?qū)⑺兄形臉?biāo)號(hào)替換為英文標(biāo)號(hào)。利用正則表達(dá)式將所有特殊字符過(guò)濾,或利用replaceAll()將中文標(biāo)號(hào)替換為英文標(biāo)號(hào)。則轉(zhuǎn)化之后,則可解決排版混亂問(wèn)題。
解決之前層次不齊的排版截圖:
解決之后的整齊排版,如下圖:
Android自定義view-文本自動(dòng)換行
文本自動(dòng)換行原理:文本超出控件寬度后,自動(dòng)換到下一行繪制。
實(shí)現(xiàn)代碼:
https://github.com/programingjd/justified
http://blog.sina.com.cn/s/blog_73615d370100zpt5.html
今天忽然發(fā)現(xiàn)android項(xiàng)目中的文字排版參差不齊的情況非常嚴(yán)重,不得不想辦法解決一下。經(jīng)過(guò)研究之后,終于找到了textview自動(dòng)換行導(dǎo)致混亂的原因了----半角字符與全角字符混亂所致!一般情況下,我們輸入的數(shù)字、字母以及英文標(biāo)點(diǎn)都是半角,所以占位無(wú)法確定。它們與漢字的占位大大的不同,由于這個(gè)原因,導(dǎo)致很多文字的排版都是參差不齊的。對(duì)此我找到了兩種辦法可以解決這個(gè)問(wèn)題:
1. 將textview中的字符全角化。即將所有的數(shù)字、字母及標(biāo)點(diǎn)全部轉(zhuǎn)為全角字符,使它們與漢字同占兩個(gè)字節(jié),這樣就可以避免由于占位導(dǎo)致的排版混亂問(wèn)題了。 半角轉(zhuǎn)為全角的代碼如下,只需調(diào)用即可。
/** * 半角轉(zhuǎn)換為全角 * * @param input * @return */ public static String ToDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 12288) { c[i] = (char) 32; continue; } if (c[i] > 65280 && c[i] < 65375) c[i] = (char) (c[i] - 65248); } return new String(c); }
2. 去除特殊字符或?qū)⑺兄形臉?biāo)號(hào)替換為英文標(biāo)號(hào)。利用正則表達(dá)式將所有特殊字符過(guò)濾,或利用replaceAll()將中文標(biāo)號(hào)替換為英文標(biāo)號(hào)。則轉(zhuǎn)化之后,則可解決排版混亂問(wèn)題。
/** * 去除特殊字符或?qū)⑺兄形臉?biāo)號(hào)替換為英文標(biāo)號(hào) * * @param str * @return */ public static String stringFilter(String str) { str = str.replaceAll("【", "[").replaceAll("】", "]") .replaceAll("!", "!").replaceAll(":", ":");// 替換中文標(biāo)號(hào) String regEx = "[『』]"; // 清除掉特殊字符 Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); }
解決之前層次不齊的排版截圖:

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

Android自定義view-文本自動(dòng)換行
文本自動(dòng)換行原理:文本超出控件寬度后,自動(dòng)換到下一行繪制。
實(shí)現(xiàn)代碼:
protected void onDraw(Canvas canvas) { FontMetrics fm = mPaint.getFontMetrics(); float baseline = fm.descent - fm.ascent; float x = 0; float y = baseline; //由于系統(tǒng)基于字體的底部來(lái)繪制文本,所有需要加上字體的高度。 String txt = getResources().getString(com.orgcent.demo.R.string.hello); //文本自動(dòng)換行 String[] texts = autoSplit(txt, mPaint, getWidth() - 5); System.out.printf("line indexs: %s\n", Arrays.toString(texts)); for(String text : texts) { canvas.drawText(text, x, y, mPaint); //坐標(biāo)以控件左上角為原點(diǎn) y += baseline + fm.leading; //添加字體行間距 } }
/** * 自動(dòng)分割文本 * @param content 需要分割的文本 * @param p 畫筆,用來(lái)根據(jù)字體測(cè)量文本的寬度 * @param width 最大的可顯示像素(一般為控件的寬度) * @return 一個(gè)字符串?dāng)?shù)組,保存每行的文本 */ private String[] autoSplit(String content, Paint p, float width) { int length = content.length(); float textWidth = p.measureText(content); if(textWidth < = width) { return new String[]{content}; } int start = 0, end = 1, i = 0; int lines = (int) Math.ceil(textWidth / width); //計(jì)算行數(shù) String[] lineTexts = new String[lines]; while(start < length) { if(p.measureText(content, start, end) > width) { //文本寬度超出控件寬度時(shí) lineTexts[i++] = (String) content.subSequence(start, end); start = end; } if(end == length) { //不足一行的文本 lineTexts[i] = (String) content.subSequence(start, end); break; } end += 1; } return lineTexts; }

更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
