AverageTextView——均匀显示的TextView

1,150 阅读1分钟

显示效果如下图:

源起于项目中不少地方要用到的类似显示--固定长度的textview,显示的内容有多有少但需要平均分配显示。所有就做了这么一个控件,实现了一些基本功能。

项目地址:github.com/maxZhou7/Ut…

具体实现文件是在目录:Utils/utilslib/src/main/java/com/max/utils/widget/AverageTextView.java 

实现原理,继承View重写onDraw方法,计算文字宽度,得到每个文字间的空隙宽度,然后再绘制出每个文字。大致代码如下:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int width = getWidth();//控件宽度
    int length = mText.length();//文字数量

    while (width < txtWidth && mText.length() >= 0) {
        mText = mText.substring(0, mText.length() - 1);
        mPaint.getTextBounds(mText, 0, mText.length(), rAll);
        txtWidth = rAll.width();
        length = mText.length();
    }
    if (width < txtWidth) {
        LogUtil.INSTANCE.e(TAG, "too many words");
        return;//一个也放不下
    }
    if (length == 0) {
        LogUtil.INSTANCE.e(TAG, "no word can be draw");
        return;
    }
    int drawBaseY = txtHeight + VIEW_HEIGHT / 2;
    int div = length == 1 ? 0 : (width - txtWidth) / (length - 1);
    for (int i = 0; i < length; i++) {//循环绘文字
        String temp = mText.substring(i, i + 1);
        String passString = mText.substring(0, i);
        Rect rect = new Rect();
        mPaint.getTextBounds(passString, 0, passString.length(), rect);
        int passWidth = rect.width() + div * i;
        canvas.drawText(temp, passWidth, drawBaseY - rAll.bottom, mPaint);
    }
}

另外还提供了一些简单的基本操作方法,设置文字内容颜色及大小,同时可以设置文字与上下的间隔padding。

综上记录了此控件的简单实现和基本使用,期待提出你宝贵的意见。