美文网首页Android知识Android开发经验谈Android开发
Android ImageSpan给文字设置圆角背景 并且文字居

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

作者: 偶尔饿 | 来源:发表于2018-05-25 10:13 被阅读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张效果图

全中文的:

中文加英文的

相关文章

网友评论

  • JarryLeo:请问楼主,如果图片高于文本内容的高度很多,能否把图片相对于文本垂直居中呢:flushed:
    偶尔饿:@JarryLeo
    试着去处理图片的大小。图片最大也只会是你设置的文字的大小的高度。
    int bgSize = dp2Px(15); //这个是不带背景的文字大小。
    int tvSize = dp2Px(10); //这个是背景里面的文字大小
    String str = "自营";
    paint.setTextSize(bgSize);
    int bgPaintw = Math.round(paint.measureText(str));
    //主要是这里 要做的改变。 直接告诉他。图片是从0 到最底部
    getDrawable().setBounds(0, 0, bgPaintw, bottom);
    int bgPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
    super.draw(canvas, text, start, end, x, top , y, bottom, 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, tvPainth+(bgPainth - tvPainth) / 2, paint);
    JarryLeo:@偶尔饿 图片与文字的对齐方式只有2种,一个 bottom 一个 baseline。我尝试把图片下移,底部就被切掉了,做不到相对文字居中的效果
    偶尔饿:根据算法来处理。因为他最开始拿到的高度其实就是文字的大小算出来的高度。

本文标题:Android ImageSpan给文字设置圆角背景 并且文字居

本文链接:https://www.haomeiwen.com/subject/dedyjftx.html