美文网首页我爱编程
Android SpannableString实现TextVie

Android SpannableString实现TextVie

作者: IT一书生 | 来源:发表于2018-04-13 14:02 被阅读1389次

概述

都知道应用 SpannableString 实现TextView各种相关效果,这里遇到一种需求就是需要TextView部分文字大小不同,且居中显示。而使用SpannableString的默认效果是底部对齐,在这里就需要自定义。

效果图

默认.JPG
居中对齐.JPG

代码

默认效果的实现代码

SpannableString spanStr = new SpannableString("后面的文字默认下部对齐");
spanStr.setSpan(new ForegroundColorSpan(Color.parseColor("#0000ff")), 0, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spanStr.setSpan(new RelativeSizeSpan(0.6f), 5, spanStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
textView.setText(spanStr);

居中显示的代码实现

    private void initVIew() {
        SpannableString spanStr1 = new SpannableString("后面的文字居中显示");
        spanStr1.setSpan(new ForegroundColorSpan(Color.parseColor("#0000ff")), 0, 5, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        int fontSizePx1 = (int)sp2px(this, 12);
        spanStr1.setSpan(new VerticalCenterSpan(fontSizePx1), 5, spanStr1.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        textView1.setText(spannableString1);
    }

    public static float sp2px(Context context, float sp) {
        float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity;
        return sp * scaledDensity;
    }
/**
 * 使TextView中不同大小字体垂直居中
 */
public class VerticalCenterSpan extends ReplacementSpan {

    private float fontSizePx;    //px

    public VerticalCenterSpan(float fontSizePx) {
        this.fontSizePx = fontSizePx;
    }

    @Override
    public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
        text = text.subSequence(start, end);
        Paint p = getCustomTextPaint(paint);
        return (int) p.measureText(text.toString());
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
        text = text.subSequence(start, end);
        Paint p = getCustomTextPaint(paint);
        Paint.FontMetricsInt fm = p.getFontMetricsInt();
        // 此处重新计算y坐标,使字体居中
        canvas.drawText(text.toString(), x, y - ((y + fm.descent + y + fm.ascent) / 2 - (bottom + top) / 2), p);
    }

    private TextPaint getCustomTextPaint(Paint srcPaint) {
        TextPaint paint = new TextPaint(srcPaint);
        paint.setTextSize(fontSizePx);   //设定字体大小, sp转换为px
        return paint;
    }
}

补充

关于 SpannableString 实现TextView各种效果网上介绍比较多,这里给出一个标记一个比较详细的一个地址,仅供参考:
用SpannableString打造绚丽多彩的文本显示效果:https://www.jianshu.com/p/84067ad289d2
居中显示参考:
https://stackoverflow.com/questions/25628258/align-text-around-imagespan-center-vertical
https://blog.csdn.net/anroidyanyou/article/details/72466218

相关文章

网友评论

    本文标题:Android SpannableString实现TextVie

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