Android TextView 橫豎排切換(字方向不變)

需求是實(shí)現(xiàn)字體的橫向和豎向切換,并且切換成豎排的了字體方向不能變吧, 咱還得橫著讀,于是開始分析需求, 那普通的TextView也沒發(fā)現(xiàn)豎著但是字體方向不變的啊, 如果把Textview旋轉(zhuǎn)90度字體方向也變了,于是上網(wǎng)各種查閱,發(fā)現(xiàn)資料甚少, 但是最終發(fā)現(xiàn)了一個(gè)思路就是每一個(gè)字是一個(gè)TextView,我仔細(xì)的想了想貌似可行,那就開始搞吧, 雖然發(fā)現(xiàn)了思路但是并沒有源代碼讓我直接用, 所以本人自己自定義了一個(gè)LinearLayout, 下面看下效果圖:

這里寫圖片描述

做到這的時(shí)候我真的很欣慰,因?yàn)槲液凸就抡f這個(gè)想法的時(shí)候遭到了嘲笑哈哈,這更加堅(jiān)定了我要完成它的目標(biāo),期間也遇到了一些難點(diǎn),接下來說一下核心的思路:

  • 遇到了第一個(gè)難點(diǎn), 怎么換行啊
    解決方案 :一個(gè)TextView挨著一個(gè), 換行怎么辦, 當(dāng)從一個(gè)EditText輸入 一段文字時(shí), 換行是有換行符的啊, 于是開始實(shí)踐, 將輸入的文字轉(zhuǎn)成char[], 然后遍歷它,當(dāng)遇到換行的地方記錄此時(shí)到了第幾個(gè)字符。
  • 第二個(gè)難點(diǎn), 即使是記錄了到第幾個(gè)字符換行,那都是Textview還是一行啊
    解決方案:此時(shí)我只能大膽想象了,那我用多個(gè)LinearLayout存儲(chǔ)Textview, 外層控制方向, 里面也可以控制方向,二話不說,直接嘗試,答案是可行的, 貼下核心代碼:
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ù)來寫
            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,讓我真正感覺到是我在創(chuàng)造代碼的感覺,都說自定義View很難, 我想就難在創(chuàng)造代碼創(chuàng)造作品的過程中吧, 不過在實(shí)現(xiàn)的那一刻感覺不言而喻, 想了半個(gè)小時(shí)寫了一行代碼的感覺,真的是大部分時(shí)間都在思考, 想想寫代碼的時(shí)候很多自定義view都是從別人的github上下載的,都不如自己寫的,好親切啊哈哈, 剛實(shí)現(xiàn)的時(shí)候我就想快點(diǎn)把它分享出來, 雖然還有一些細(xì)節(jié)需要處理,但是大的框已經(jīng)實(shí)現(xiàn), 我會(huì)把它優(yōu)化好,也會(huì)上傳到github上, 如果你用到了給我點(diǎn)個(gè)star,點(diǎn)個(gè)不虧。

github地址:
https://github.com/jinguangyue/AddwordDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容