溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在Android中使用AutoWrapTextView時出現(xiàn)中英文排版問題如何解決

發(fā)布時間:2020-12-05 16:15:48 來源:億速云 閱讀:285 作者:Leah 欄目:移動開發(fā)

這篇文章將為大家詳細講解有關在Android中使用AutoWrapTextView時出現(xiàn)中英文排版問題如何解決,文章內(nèi)容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

實現(xiàn)

首先創(chuàng)建一個繼承自View的AutoWrapTextView

public class AutoWrapTextView extends View {

}

來看看它的構造方法

public AutoWrapTextView(Context context, AttributeSet attrs) {
  super(context, attrs);

  init(context, attrs);
}

private void init(Context context, AttributeSet attrs) {
  initStyle(context, attrs);
  initPaint();
}

init方法里分別調(diào)用了initStyle方法和initPaint方法;

initStyle方法主要解析自定義的屬性

 private void initStyle(Context context, AttributeSet attrs) {
  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AutoWrapTextViewStyle);
  mPaddingLeft = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingLeft, 0);
  mPaddingRight = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingRight, 0);
  mPaddingTop = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingTop, 0);
  mPaddingBottom = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_paddingBottom, 0);

  mTextColor = typedArray.getColor(R.styleable.AutoWrapTextViewStyle_textColor, Color.BLACK);
  mTextSize = typedArray.getDimensionPixelSize(R.styleable.AutoWrapTextViewStyle_textSize, 50);
  mLineSpacingExtra = typedArray.getInteger(R.styleable.AutoWrapTextViewStyle_lineSpacingExtra, 7);

  typedArray.recycle();
 }

屬性名含義都很明顯不用過多解釋,initPaint方法就是初始化一個文本畫筆

 private void initPaint() {
  mTextPaint = new TextPaint();
  mTextPaint.setAntiAlias(true);
  mTextPaint.setTextSize(mTextSize);
  mTextPaint.setColor(mTextColor);
  mTextPaint.setTextAlign(Paint.Align.LEFT);
 }

接下來我們看看設置文本的方法setText方法

 public void setText(String text) {
  if (TextUtils.isEmpty(text)) return;

  //把文本轉換成Char數(shù)組
  mTextCharArray = text.toCharArray();
  requestLayout();
 }

首先把文本轉換成Char數(shù)組,然后循環(huán)數(shù)組把整個文本拆分成N行文本,下面來看看核心方法splitText方法

 private void splitText(int heightMode) {
  if (mTextCharArray == null) return;

  mSplitTextList = new ArrayList<>();
  mSingleTextWidth = getMeasuredWidth() - mPaddingLeft - mPaddingRight;
  int currentSingleTextWidth = 0;
  StringBuffer lineStringBuffer = new StringBuffer();
  for (int i = 0, length = mTextCharArray.length; i < length; i++) {
   char textChar = mTextCharArray[i];
   currentSingleTextWidth += getSingleCharWidth(textChar);
   if (currentSingleTextWidth > mSingleTextWidth) {
    mSplitTextList.add(lineStringBuffer.toString());
    lineStringBuffer = new StringBuffer();
    currentSingleTextWidth = 0;
    i--;
   } else {
    lineStringBuffer.append(textChar);
    if (i == length - 1) mSplitTextList.add(lineStringBuffer.toString());
   }
  }

  int textHeight = 0;
  mSplitTextRectArray = new Rect[mSplitTextList.size()];
  for (int m = 0, length = mSplitTextList.size(); m < length; m++) {
   String lineText = mSplitTextList.get(m);
   Rect lineTextRect = new Rect();
   mTextPaint.getTextBounds(lineText, 0, lineText.length(), lineTextRect);
   if (heightMode == MeasureSpec.AT_MOST) {
    textHeight += (lineTextRect.height() + mLineSpacingExtra);
    if (m == length - 1) {
     textHeight = textHeight + mPaddingBottom + mPaddingTop;
    }
   } else {
    if (textHeight == 0)
     textHeight = getMeasuredHeight();
   }
   mSplitTextRectArray[m] = lineTextRect;
  }

  setMeasuredDimension(getMeasuredWidth(), textHeight);
 }

首先創(chuàng)建一個屬性名為mSplitTextList的List集合用來存放拆分的文本;

mSingleTextWidth 為單行文本顯示的寬度;

currentSingleTextWidth 為當前一行累計計算的寬度;

然后開始循環(huán)Char數(shù)組,getSingleCharWidth方法就是計算單個Char的寬度;

如果currentSingleTextWidth 小于 mSingleTextWidth 就把Char添加到lineStringBuffer 當中,如果是最后一個Char就直接把lineStringBuffer添加到mSplitTextList集合當中

如果currentSingleTextWidth 大于 mSingleTextWidth,就把lineStringBuffer添加到mSplitTextList集合當中,重新給lineStringBuffer賦值,currentSingleTextWidth 歸0;

循環(huán)結束以后拆分好的文本就都添加到mSplitTextList集合當中了。

拆分完成以后循環(huán)mSplitTextList集合,得到每一行文本的Rect值,繪制文本的時候會用到,然后設置View的寬高。

接下來就是繪制方法drawText

 public void drawText(Canvas canvas) {
  if (mSplitTextList == null || mSplitTextList.size() == 0) return;

  int marginTop = getTopTextMarginTop();
  for (int m = 0, length = mSplitTextList.size(); m < length; m++) {
   String lineText = mSplitTextList.get(m);
   canvas.drawText(lineText, mPaddingLeft, marginTop, mTextPaint);
   marginTop += (mSplitTextRectArray[m].height() + mLineSpacingExtra);
  }
 }

首先得到第一行文本距離頂部的高度marginTop,然后循環(huán)文本繪制每一行文本內(nèi)容。

關于在Android中使用AutoWrapTextView時出現(xiàn)中英文排版問題如何解決就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI