在上一节Android——SpannableString实现顶部对齐(上标,下标)中我们已经了解,SuperscriptSpanSubscriptSpan可以实现上标和下标效果,但是不可以改变大小,且显示位置固定。
今天我们要实现的效果如下:

TwoScriptTextSpan .java

public class TwoScriptTextSpan extends ReplacementSpan {    private int fontSize = -1;    private boolean isSp;    private int position;    public @interface ScriptPosition {        int LEFT_TOP = 1;        int LEFT_BOTTOM = 2;        int RIGHT_TOP = 3;        int RIGHT_BOTTOM = 4;    }    public TwoScriptTextSpan(int fontSize, boolean isSp) {        this.fontSize = fontSize;        this.isSp = isSp;    }    public TwoScriptTextSpan(int fontSize, boolean isSp, int position) {        this.fontSize = fontSize;        this.isSp = isSp;        this.position = position;    }    @Override    public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) {        Paint newPaint = getCustomTextPaint(paint);        return (int) newPaint.measureText(text, start, end);    }    @Override    public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int            bottom, @NonNull Paint paint) {        Paint newPaint = getCustomTextPaint(paint);        text = text.subSequence(start, end);        String[] parts = text.toString().split(",");        float width1 = newPaint.measureText(parts[0]);        float width2 = newPaint.measureText(parts[1]);        float maxWidth = Math.max(width1, width2);        float minWidth = Math.min(width1, width2);        canvas.drawText(parts[0], x + minWidth + (maxWidth - width1), y - (bottom - top) / 3f, newPaint);        canvas.drawText(parts[1], x + minWidth + (maxWidth - width2), y, newPaint);    }    private TextPaint getCustomTextPaint(Paint srcPaint) {        TextPaint textPaint = new TextPaint(srcPaint);        if (fontSize != -1) {            textPaint.setTextSize(isSp ? fontSize * textPaint.density : fontSize);        }        return textPaint;    }}

MainActivity.java

String format = "9,4Be -> 2000,127Jo";SpannableString ss = new SpannableString(format);TwoScriptTextSpan leftTopSpan = new TwoScriptTextSpan(25, true,1);ss.setSpan(leftTopSpan, 0, 3, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);TwoScriptTextSpan rightTopSpan = new TwoScriptTextSpan(25, true,2);ss.setSpan(rightTopSpan, 9, 17, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);tvImageSpan.setText(ss);

更多相关文章

  1. Android(安卓)动画效果 --Animation 动画专题研究
  2. android使用SmartRefreshLayout库实现下拉刷新和上拉加载
  3. android 半透明圆角dialog的简单实现
  4. android开发之给LinearLayout增加点击效果
  5. Android(安卓)导航条效果实现(四) ViewPager+自定义导航条
  6. 九宫格的实现及九宫格源码
  7. 【总结备用】Android监听网络状态实现(BroadcastReceiver + Serv
  8. Android(安卓)实现联网——在线程中联网
  9. 浅谈Java中Collections.sort对List排序的两种方法

随机推荐

  1. Android(安卓)Service之串行化Service:Int
  2. appium for window 环境搭建
  3. Android运行模拟器
  4. android 输入法的显示和隐藏
  5. 2010.12.15——— android listView 显示
  6. linux下用git下载android任意模块源码
  7. AndroidPN的学习研究(一)环境建立
  8. RN调用Java原生方法步骤
  9. Kotlin for Android - 常用关键字
  10. 用 Python脚本生成 Android SALT 盐值