2019日更挑戰(zhàn)(三),android-聊聊TextView

瞎扯

TextView.個(gè)人認(rèn)為是android開(kāi)發(fā)中用的最頻繁的一個(gè)控件了.
非常強(qiáng)大,絕不是只簡(jiǎn)單的顯示文字而已.

常見(jiàn)的幾種寫(xiě)法,效果:

1.圖片加文字的條目

image.png

是不是一個(gè)控件就搞定了一個(gè)條目.

 <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0"
        android:drawableLeft="@mipmap/ic_launcher"
        android:drawableRight="@drawable/ic_arrow_forward_black_24dp"
        android:drawablePadding="8dp"
        android:gravity="left"
        android:padding="8dp"
        android:text="1111111" />

2. 帶選擇器的,選中效果的

image.png
 <TextView
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginTop="10dp"
        android:background="#0ff"
        android:drawableLeft="@drawable/ic_check_circle_black_24dp"
        android:drawableRight="@drawable/ic_arrow_forward_black_24dp"
        android:drawablePadding="8dp"
        android:gravity="center_vertical"
        android:enabled="true"
        android:padding="8dp"
        android:text="22222" />

3.上下結(jié)構(gòu)icon,帶省略號(hào):

image.png
    <TextView
            android:layout_width="90dp"
            android:layout_height="wrap_content"
            android:background="#edf"
            android:drawableTop="@drawable/ic_home_black_24dp"
            android:drawablePadding="8dp"
            android:ellipsize="end"
            android:gravity="center"
            android:lines="1"
            android:padding="8dp"
            android:text="3333333333" />

4.能夠點(diǎn)擊,顯示超鏈接的

image.png
   <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:autoLink="all"
            android:background="#dfe"
            android:drawableTop="@mipmap/ic_launcher"
            android:drawablePadding="8dp"
            android:gravity="center"
            android:lines="1"
            android:padding="8dp"
            android:text="http://www.baidu.com " />

5.展示多行的

image.png
 <RelativeLayout
        android:layout_marginTop="10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#dfe"
            android:drawableTop="@mipmap/ic_launcher"
            android:drawablePadding="8dp"
            android:gravity="left"
            android:padding="8dp"
            android:text="444\n44444444" />

        <TextView
            android:layout_marginLeft="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/tv_4"
            android:background="#dfe"
            android:drawableLeft="@mipmap/ic_launcher"
            android:drawablePadding="8dp"
            android:padding="8dp"
            android:text="555\n55555\n55555555555\n555555555555555" />
    </RelativeLayout>

是不是很強(qiáng)大.但TextView并不是沒(méi)有缺點(diǎn)

實(shí)際寫(xiě)起來(lái)你就會(huì)發(fā)現(xiàn).不能控制icon的大小.

不過(guò)這沒(méi)什么,git上有可以控制drawable大小的自定義TextView.


支持html格式解析.

這也是TextView的一大亮點(diǎn)

Html.ImageGetter imgGetter = new Html.ImageGetter() {
        public Drawable getDrawable(String source) {
            //這里加載圖片資源.
            return drawable;
        }
    };
Spanned text = Html.fromHtml(htmlStr, imgGetter, null);
textView.setText(text);
然后就可以愉快的圖文混排了.

當(dāng)然,webview也是可以做到的.而且不用操作圖片加載的問(wèn)題.這個(gè)就看個(gè)人選擇了.


強(qiáng)大的Spanned

這個(gè)東西非常厲害,為啥厲害呢?
看個(gè)效果圖,就拿簡(jiǎn)書(shū)的來(lái)說(shuō)


image.png

如果是新手,寫(xiě)這個(gè).肯定是

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

我相信肯定,肯定有人會(huì)這樣寫(xiě),然后調(diào)大小,調(diào)邊距....然后如果很多地方都有這種
就每個(gè)xmlcopy,copy.


實(shí)際上呢.
這個(gè)效果只需要一個(gè)TextView就足夠了.
然后再寫(xiě)個(gè)工廠,生成一下.不管哪里用到都一行代碼搞定.

如下:


image.png
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        parseText((TextView) findViewById(R.id.tv_6), "哈哈", "0.173", 11, 22, 33);
    }

    public void parseText(TextView textView, String name, String str0, int str1, int str2, int str3) {
        float textSize = textView.getTextSize();
        String text = "#1" + str0 + "\t" + name + "\t#2" + str1 + "\t#3" + str2 + "\t#4" + str3;
        SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(text);
        Resources resources = getResources();
        //添加鉆石圖標(biāo)
        int i = text.indexOf("#1");//這個(gè)#1,相當(dāng)于一個(gè)占位符
        int iLength = "#1".length();//拿到占位符的長(zhǎng)度.
        ImageSpan star = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_star_black_24dp));
        //這里就是把對(duì)應(yīng)的#1占位符替換成icon圖標(biāo)
        //需要4個(gè)參數(shù),ImageSpan,替換的起點(diǎn),終點(diǎn),替換模式.
        spannableBuilder.setSpan(star, i, i + iLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        //設(shè)置紅色
        spannableBuilder.setSpan(new ForegroundColorSpan(resources.getColor(R.color.colorAccent)), i + iLength,
                str0.length() + i + iLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        //添加眼睛圖標(biāo)及數(shù)量
        int i2 = text.indexOf("#2");
        ImageSpan eye = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_remove_red_eye_black_24dp));
        spannableBuilder.setSpan(eye, i2, i2 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        //添加評(píng)論圖標(biāo)及數(shù)量
        int i3 = text.indexOf("#3");
        ImageSpan sms = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_sms_black_24dp));
        spannableBuilder.setSpan(sms, i3, i3 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        //添加心圖標(biāo)及數(shù)量
        int i4 = text.indexOf("#4");
        ImageSpan favorite = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_favorite_black_24dp));
        spannableBuilder.setSpan(favorite, i4, i4 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

        textView.setText(spannableBuilder);
    }

    @NonNull
    private ImageSpan getImageSpan(int textSize, Drawable drawable) {
        drawable.setBounds(0, 0, textSize, textSize);
        return new CenterAlignImageSpan(drawable);
    }
}

居中顯示的ImageSpan

/**
* 居中顯示的ImageSpan
**/
    public class CenterAlignImageSpan extends ImageSpan {
        public CenterAlignImageSpan(Drawable drawable) {
            super(drawable);
        }

        public CenterAlignImageSpan(Bitmap b) {
            super(b);
        }

        public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
            Drawable b = this.getDrawable();
            Paint.FontMetricsInt fm = paint.getFontMetricsInt();
            int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;
            canvas.save();
            canvas.translate(x, (float) transY);
            b.draw(canvas);
            canvas.restore();
        }
    }

看起來(lái)很麻煩.對(duì)不對(duì).封裝一下.就很簡(jiǎn)單了


交流群:493180098,這是個(gè)很少吹水,交流學(xué)習(xí)的群.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末都伪,一起剝皮案震驚了整個(gè)濱河市掠廓,隨后出現(xiàn)的幾起案子酌儒,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唠倦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)木张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)端三,“玉大人舷礼,你說(shuō)我怎么就攤上這事〗即常” “怎么了妻献?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)团赁。 經(jīng)常有香客問(wèn)我育拨,道長(zhǎng),這世上最難降的妖魔是什么欢摄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任熬丧,我火速辦了婚禮,結(jié)果婚禮上剧浸,老公的妹妹穿的比我還像新娘锹引。我一直安慰自己,他們只是感情好唆香,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布嫌变。 她就那樣靜靜地躺著,像睡著了一般躬它。 火紅的嫁衣襯著肌膚如雪腾啥。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天冯吓,我揣著相機(jī)與錄音倘待,去河邊找鬼。 笑死组贺,一個(gè)胖子當(dāng)著我的面吹牛凸舵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播失尖,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啊奄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渐苏!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起菇夸,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤琼富,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后庄新,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鞠眉,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年择诈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了械蹋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吭从,死狀恐怖朝蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩金,我是刑警寧澤谱醇,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站步做,受9級(jí)特大地震影響副渴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜全度,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一煮剧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧将鸵,春花似錦勉盅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至痒筒,卻和暖如春宰闰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背簿透。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工移袍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人老充。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓葡盗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親啡浊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戳粒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容