AverageTextView——均勻顯示的TextView

MaxChou7發表於2018-06-14

顯示效果如下圖:

AverageTextView——均勻顯示的TextView

源起於專案中不少地方要用到的類似顯示--固定長度的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。

綜上記錄了此控制元件的簡單實現和基本使用,期待提出你寶貴的意見。


相關文章