Android直播间消息流图文混排

7次阅读

共计 758 个字符,预计需要花费 2 分钟才能阅读完成。

刚收到需求无脑想了想 TextView 加上 ImageSpan 就可以完美解决这个问题,做的时候发现不对,如果用户等级有 100 级,就要放置最少 100 张图片到 APK 里面,如果区分男女不同级别展示背景色不一致或者样式不一致,那就是灾难。

怎么办?

如果用多个 View 来实现,复杂度直线上升,单行文本没有问题,多行文本时候就是灾难,需要考虑的东西太多。

这时候想到之前自定义 ImageSpan,让图片和文本对齐时候做的一些小操作,里面有 Canvas 对象,灵光乍现,直接在 ImageSpan 的 onDraw 方法里面绘制要显示的数字就可以了。

上代码:
···

    @Override
    public void draw(@NonNull Canvas canvas, CharSequence text,
                     int start, int end, float x,
                     int top, int y, int bottom, @NonNull Paint paint) {
        // image to draw
        Drawable b = getDrawable();

        int halfWidth = (int) (b.getIntrinsicWidth()/2f);


        // font metrics of text to be replaced
        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        int transY = (y + fm.descent + y + fm.ascent) / 2
                - b.getBounds().bottom / 2;

        canvas.save();
        canvas.translate(x, transY);

        b.draw(canvas);

        canvas.restore();

        canvas.drawText(level, x + halfWidth, y, levelTextPaint);
    }

···

基本就可以解决上述问题。

正文完
 0