Android知识Android开发经验谈Android开发

Android ImageSpan给文字设置圆角背景 并且文字居

2018-05-25  本文已影响332人  偶尔饿

通过SpannableString 设置ImageSpan来实现的。

如果有什么不对的地方,或者影响效率等等的。请你多多指点,谢谢!我们应该是相互学习的。

代码:
private void setTitle(String name, TextView textView) {

//这里首先赋值为空字符串。是因为在切换的时候可能会出现的格式问题。  在空格最后加上全角空格。也处理了。

    textView.setText("");

    //12个空格(自己决定空格数量决定)  最后一个空格用的是全角的。因为有中英文所以。给圆角。避免空隙太大。

    final String str ="         " + name;

    SpannableString style =new SpannableString(str);

    //画的一个圆角图  这里是你需要画的背景图

    Drawable bg = getResources().getDrawable(R.drawable.cor100_red_gradient);

    style.setSpan(new ImageSpan(bg) {

        @Override

        public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y,

            int bottom, Paint paint) {

            int bgSize = dp2Px(15);

            int tvSize = dp2Px(10);

            String str ="自营";

            paint.setTextSize(bgSize);

            int bgPaintw = Math.round(paint.measureText(str));

            getDrawable().setBounds(0, 0, bgPaintw, bgSize);

            int bgPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);

            super.draw(canvas, text, start, end, x, top + (bottom - bgPainth), y, bottom - (bottom - bgPainth), paint);

            paint.setColor(Color.WHITE);

            paint.setTextSize(tvSize);

            //文字的宽度

            int tvPaintw = Math.round(paint.measureText(str));

            //文字的高度

            int tvPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);

            //文字的位置

//x+(bgPaintw-tvPaintw)/2 表示x的开始位置。 y - (bgPainth - tvPainth) / 2  表示y的开始位置。这样来处理文字剧中

//这里  文字背景是大于文字的。 要让文字居中,(需要你处理的文字背景宽度 -  文字的宽度 )再除以2。加上x就是文字x皱的起点

//(需要你处理的文字背景高度 -  文字的高度 )再除以2。加上y就是文字y皱的起点

            canvas.drawText(str, x + (bgPaintw - tvPaintw) /2, y - (bgPainth - tvPainth) /2, paint);

        }

}, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

    textView.setText(style);

    textView.setMovementMethod(LinkMovementMethod.getInstance());

}

public int dp2Px(float dp) {

float scale =this.getResources().getDisplayMetrics().density;

    return (int) (dp * scale +0.5f);

}

这里放2张效果图

全中文的:

中文加英文的

上一篇 下一篇

猜你喜欢

热点阅读