控制TextView側(cè)邊圖標(biāo)大小以及顯示位置

一般來(lái)說(shuō)TextView側(cè)邊的圖標(biāo)位置都是居中顯示的,并且圖標(biāo)大小是按照?qǐng)D標(biāo)的尺寸來(lái)顯示的捂寿。例如叉橱,假如你給TextView設(shè)置了drawableLeft,此時(shí)該圖標(biāo)的位置以及大小是不可控的者蠕,這樣就會(huì)出現(xiàn)兩種問(wèn)題:
1窃祝、如果TextView文字過(guò)長(zhǎng)導(dǎo)致?lián)Q行,然而左邊的圖標(biāo)仍然是按照TextView的高度垂直居中顯示踱侣,然而我們想要的卻是想讓圖標(biāo)在第一行居中顯示授嘀;
2、圖標(biāo)過(guò)大或者過(guò)小不可控怨绣;

此時(shí)就要考慮自定義TextView來(lái)解決此類(lèi)問(wèn)題了赋秀。具體思路為:
1、對(duì)于圖標(biāo)的位置待榔,可以考慮設(shè)置圖標(biāo)Drawable的整體偏移量逞壁;
2、對(duì)于圖標(biāo)的大小锐锣,則是自定義其大须绱场;

具體顯示效果如下:


圖標(biāo)方位及大小.png

具體實(shí)現(xiàn)如下:

public class DrawableTextView extends AppCompatTextView {
    // 控件左雕憔、上姿骏、右、下圖標(biāo)的寬和高
    private int drawableLeftWidth, drawableTopWidth, drawableRightWidth, drawableBottomWidth;
    private int drawableLeftHeight, drawableTopHeight, drawableRightHeight, drawableBottomHeight;
    // 默認(rèn)顯示方式
    private boolean alignCenter = true;
    private int mWidth;

    public DrawableTextView(Context context) {
        this(context, null);
    }

    public DrawableTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DrawableTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context, attrs);
    }

    private void initView(Context context, AttributeSet attrs) {
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DrawableTextView);
        drawableLeftWidth = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableLeftWidth, 0);
        drawableTopWidth = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableTopWidth, 0);
        drawableRightWidth = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableRightWidth, 0);
        drawableBottomWidth = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableBottomWidth, 0);
        drawableLeftHeight = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableLeftHeight, 0);
        drawableTopHeight = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableTopHeight, 0);
        drawableRightHeight = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableRightHeight, 0);
        drawableBottomHeight = typedArray.getDimensionPixelSize(R.styleable.DrawableTextView_drawableBottomHeight, 0);
        alignCenter = typedArray.getBoolean(R.styleable.DrawableTextView_alignCenter, true);
        typedArray.recycle();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        Drawable[] drawables = getCompoundDrawables();
        Drawable drawableLeft = drawables[0];
        Drawable drawableTop = drawables[1];
        Drawable drawableRight = drawables[2];
        Drawable drawableBottom = drawables[3];
        if (drawableLeft != null) {
            setDrawable(drawableLeft, 0, drawableLeftWidth, drawableLeftHeight);
        }
        if (drawableTop != null) {
            setDrawable(drawableTop, 1, drawableTopWidth, drawableTopHeight);
        }
        if (drawableRight != null) {
            setDrawable(drawableRight, 2, drawableRightWidth, drawableRightHeight);
        }
        if (drawableBottom != null) {
            setDrawable(drawableBottom, 3, drawableBottomWidth, drawableBottomHeight);
        }
        this.setCompoundDrawables(drawableLeft, drawableTop, drawableRight, drawableBottom);
    }

    /**
     * 設(shè)置圖標(biāo)大小及其偏移量
     */
    private void setDrawable(Drawable drawable, int tag, int drawableWidth, int drawableHeight) {
        int width = drawableWidth == 0 ? drawable.getIntrinsicWidth() : drawableWidth;
        int height = drawableHeight == 0 ? drawable.getIntrinsicHeight() : drawableHeight;
        int left = 0, top = 0, right = 0, bottom = 0;
        switch (tag) {
            case 0:
            case 2:
                left = 0;
                top = alignCenter ? 0 : -getLineCount() * getLineHeight() / 2 + getLineHeight() / 2;
                right = width;
                bottom = top + height;
                break;
            case 1:
            case 3:
                left = alignCenter ? 0 : -mWidth / 2 + width / 2;
                top = 0;
                right = left + width;
                bottom = top + height;
                break;
        }
        drawable.setBounds(left, top, right, bottom);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斤彼,一起剝皮案震驚了整個(gè)濱河市分瘦,隨后出現(xiàn)的幾起案子蘸泻,更是在濱河造成了極大的恐慌,老刑警劉巖嘲玫,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦施,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡去团,警方通過(guò)查閱死者的電腦和手機(jī)抡诞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渗勘,“玉大人沐绒,你說(shuō)我怎么就攤上這事⊥梗” “怎么了乔遮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)取刃。 經(jīng)常有香客問(wèn)我蹋肮,道長(zhǎng),這世上最難降的妖魔是什么璧疗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任坯辩,我火速辦了婚禮,結(jié)果婚禮上崩侠,老公的妹妹穿的比我還像新娘漆魔。我一直安慰自己,他們只是感情好却音,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布改抡。 她就那樣靜靜地躺著,像睡著了一般系瓢。 火紅的嫁衣襯著肌膚如雪阿纤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天夷陋,我揣著相機(jī)與錄音欠拾,去河邊找鬼。 笑死骗绕,一個(gè)胖子當(dāng)著我的面吹牛藐窄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爹谭,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼枷邪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了诺凡?” 一聲冷哼從身側(cè)響起东揣,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腹泌,沒(méi)想到半個(gè)月后嘶卧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凉袱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年芥吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片专甩。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钟鸵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涤躲,到底是詐尸還是另有隱情棺耍,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布种樱,位于F島的核電站蒙袍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嫩挤。R本人自食惡果不足惜害幅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岂昭。 院中可真熱鬧以现,春花似錦、人聲如沸约啊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棍苹。三九已至无宿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間枢里,已是汗流浹背孽鸡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栏豺,地道東北人彬碱。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像奥洼,于是被迫代替她去往敵國(guó)和親巷疼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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