日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

解決TextView排版自動(dòng)換行問(wèn)題

系統(tǒng) 2196 0
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)用即可。
    
/**
	 * 半角轉(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();
	}

  

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

解決TextView排版自動(dòng)換行問(wèn)題

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

解決TextView排版自動(dòng)換行問(wèn)題

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;
}

  


解決TextView排版自動(dòng)換行問(wèn)題

解決TextView排版自動(dòng)換行問(wèn)題


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 自贡市| 邮箱| 黔东| 双峰县| 开江县| 财经| 宿州市| 射洪县| 察雅县| 大埔区| 宁陕县| 临澧县| 焉耆| 南丹县| 罗定市| 松原市| 西乌珠穆沁旗| 亳州市| 米泉市| 新丰县| 渑池县| 石楼县| 巧家县| 彩票| 金坛市| 澄迈县| 武威市| 崇文区| 青浦区| 淅川县| 锦屏县| 太仆寺旗| 五莲县| 奉节县| 托克逊县| 梅河口市| 高淳县| 遂宁市| 肥西县| 象山县| 交口县|