需求是實(shí)現(xiàn)字體的橫向和豎向切換赠尾,并且切換成豎排的了字體方向不能變吧, 咱還得橫著讀良漱,于是開(kāi)始分析需求, 那普通的TextView也沒(méi)發(fā)現(xiàn)豎著但是字體方向不變的啊欢际, 如果把Textview旋轉(zhuǎn)90度字體方向也變了母市,于是上網(wǎng)各種查閱,發(fā)現(xiàn)資料甚少损趋, 但是最終發(fā)現(xiàn)了一個(gè)思路就是每一個(gè)字是一個(gè)TextView患久,我仔細(xì)的想了想貌似可行,那就開(kāi)始搞吧浑槽, 雖然發(fā)現(xiàn)了思路但是并沒(méi)有源代碼讓我直接用蒋失, 所以本人自己自定義了一個(gè)LinearLayout, 下面看下效果圖:
做到這的時(shí)候我真的很欣慰桐玻,因?yàn)槲液凸就抡f(shuō)這個(gè)想法的時(shí)候遭到了嘲笑哈哈篙挽,這更加堅(jiān)定了我要完成它的目標(biāo),期間也遇到了一些難點(diǎn)镊靴,接下來(lái)說(shuō)一下核心的思路:
-
遇到了第一個(gè)難點(diǎn)铣卡, 怎么換行啊
解決方案 :一個(gè)TextView挨著一個(gè), 換行怎么辦偏竟, 當(dāng)從一個(gè)EditText輸入 一段文字時(shí)煮落, 換行是有換行符的啊, 于是開(kāi)始實(shí)踐踊谋, 將輸入的文字轉(zhuǎn)成char[]州邢, 然后遍歷它,當(dāng)遇到換行的地方記錄此時(shí)到了第幾個(gè)字符褪子。 -
第二個(gè)難點(diǎn), 即使是記錄了到第幾個(gè)字符換行骗村,那都是Textview還是一行啊
解決方案:此時(shí)我只能大膽想象了嫌褪,那我用多個(gè)LinearLayout存儲(chǔ)Textview, 外層控制方向胚股, 里面也可以控制方向笼痛,二話不說(shuō),直接嘗試琅拌,答案是可行的缨伊, 貼下核心代碼:
private void addText() {
//在添加字之前移除所有已經(jīng)添加的View
removeAllViews();
//存儲(chǔ)換行字符的位置
ns = new ArrayList<Integer>();
if (text != null) {
//轉(zhuǎn)成char[] 可遍歷
char[] chars = text.toCharArray();
//后面要截取從0到換行符的字符添加到LinearLayout中 所以要加0
ns.add(0);
for (int i = 0; i < chars.length; i++) {
//當(dāng)碰到換行符 add it
if(String.valueOf(text.charAt(i)).equals("\n")){
ns.add(i);
}
}
//最后加到字符末尾 注意是length()
ns.add(text.length());
//我們不能確定有多少換行符, 那也不能確定有多少個(gè)Linearlayout 所以這里根據(jù)換行符個(gè)數(shù)來(lái)寫
customLinearlayouts = new CustomLinearlayout[ns.size()-1];
for(int i=0; i<ns.size()-1; i++){
customLinearlayouts[i] = new CustomLinearlayout(context);
customLinearlayouts[i].setTextColor(color);
customLinearlayouts[i].setTextSize(size);
//將每個(gè)字符設(shè)置到一個(gè)Textview上并且添加到customLinearlayouts中
customLinearlayouts[i].setText((text.substring(ns.get(i), ns.get(i+1)).trim()));
//最后將所有的customLinearlayouts 加入到最大的 Linearlayout中
addView(customLinearlayouts[i]);
}
setChildViewOrientation(customLinearlayouts, orientation);
}
}
肺腑之言: 自定義View最好自己一步步寫
注釋詳細(xì)进宝, 不多解釋了刻坊, 這是我第一次自己寫自定義View,讓我真正感覺(jué)到是我在創(chuàng)造代碼的感覺(jué)党晋,都說(shuō)自定義View很難谭胚, 我想就難在創(chuàng)造代碼創(chuàng)造作品的過(guò)程中吧徐块, 不過(guò)在實(shí)現(xiàn)的那一刻感覺(jué)不言而喻, 想了半個(gè)小時(shí)寫了一行代碼的感覺(jué)灾而,真的是大部分時(shí)間都在思考胡控, 想想寫代碼的時(shí)候很多自定義view都是從別人的github上下載的,都不如自己寫的旁趟,好親切啊哈哈昼激, 剛實(shí)現(xiàn)的時(shí)候我就想快點(diǎn)把它分享出來(lái), 雖然還有一些細(xì)節(jié)需要處理锡搜,但是大的框已經(jīng)實(shí)現(xiàn)橙困, 我會(huì)把它優(yōu)化好,也會(huì)上傳到github上余爆, 如果你用到了給我點(diǎn)個(gè)star纷宇,點(diǎn)個(gè)不虧。