91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Android TextView兩端對齊解決辦法

發布時間:2020-10-08 05:56:05 來源:腳本之家 閱讀:581 作者:lqh 欄目:移動開發

Android TextView兩端對齊解決辦法

今天遇到一個關于TextView文字兩端對齊其實方案,大家都知道原生控件是不能滿足我們的需求的,因此需要自定義View

下面看下效果圖

Android TextView兩端對齊解決辦法

package com.example.VerticalMarqueeTextView.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.TextView;

/**
 * Created by John on 2017/2/9.
 */

public class WordAlignTextView extends TextView {
  private float textSize;
  private float textLineHeight;
  //頂部
  private int top;
  //y軸
  private int y;
  //線
  private int lines;
  //底部
  private int bottom;
  //右邊
  private int right;
  //左邊
  private int left;
  //線字
  private int lineDrawWords;
  private char[] textCharArray;
  private float singleWordWidth;
   //每個字符的空隙
  private float lineSpacingExtra;

  private boolean isFirst = true;

  public WordAlignTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
      @Override
      public boolean onPreDraw() {
        initTextInfo();
        return true;
      }
    });
  }

  public WordAlignTextView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public WordAlignTextView(Context context) {
    this(context, null, 0);
  }


  public void initTextInfo() {
    textSize = getTextSize();
    //獲取線的高度
    textLineHeight = getLineHeight();
    left = 0;
    right = getRight();
    y = getTop();
    // 要畫的寬度
    int drawTotalWidth = right - left;
    String text = getText().toString();
    if (!TextUtils.isEmpty(text) && isFirst) {
      textCharArray = text.toCharArray();
      TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
      mTextPaint.density = getResources().getDisplayMetrics().density;
      mTextPaint.setTextSize(textSize);
      // 獲取單個單詞的的寬度
      singleWordWidth = mTextPaint.measureText("一") + lineSpacingExtra;
      // 每行可以放多少個字符
      lineDrawWords = (int) (drawTotalWidth / singleWordWidth);
      int length = textCharArray.length;
      lines = length / lineDrawWords;
      if ((length % lineDrawWords) > 0) {
        lines = lines + 1;
      }
      first = false;
      ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
      int totalHeight = (int) (lines*textLineHeight+textLineHeight*2 + getPaddingBottom()+getPaddingTop()+layoutParams.bottomMargin+layoutParams.topMargin);
      setHeight(totalHeight);
    }
  }

  @Override
  protected void onDraw(Canvas canvas) {
    bottom = getBottom();
    int drawTotalLine = lines;

    if(maxLine!=0&&drawTotalLine>maxLine){
      drawTotalLine = maxLine;
    }

    for (int i = 0; i < drawTotalLine; i++) {
      try {
        int length = textCharArray.length;
        int mLeft = left;
        // 第i+1行開始的字符index
        int startIndex = (i * 1) * lineDrawWords;
        // 第i+1行結束的字符index
        int endTextIndex = startIndex + lineDrawWords;
        if (endTextIndex > length) {
          endTextIndex = length;
          y += textLineHeight;
        } else {
          y += textLineHeight;
        }
        for (; startIndex < endTextIndex; startIndex++) {
          char c = textCharArray[startIndex];
//     if (c == ' ') {
//      c = '\u3000';
//     } else if (c < '\177') {
//      c = (char) (c + 65248);
//     }
          canvas.drawText(String.valueOf(c), mLeft, y, getPaint());
          mLeft += singleWordWidth;
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  int maxLine;

  public void setMaxLines(int max){
    this.maxLine = max;
  }

  public void setLineSpacingExtra(int lineSpacingExtra){
    this.lineSpacingExtra = lineSpacingExtra;
  }

  /**
   * 判斷是否為中文
   * @return
   */
  public static boolean containChinese(String string){
    boolean flag = false;
    for (int i = 0; i < string.length(); i++) {
      char c = string.charAt(i);
      if ((c >= 0x4e00) && (c <= 0x9FA5)) {
        flag = true;
      }
    }
    return flag;
  }

  public static String ToDBC(String input) {
    // 導致TextView異常換行的原因:安卓默認數字、字母不能為第一行以后每行的開頭字符,因為數字、字母為半角字符
    // 所以我們只需要將半角字符轉換為全角字符即可
    char c[] = input.toCharArray();
    for (int i = 0; i < c.length; i++) {
      if (c[i] == ' ') {
        c[i] = '\u3000';
      } else if (c[i] < '\177') {
        c[i] = (char) (c[i] + 65248);
      }
    }
    return new String(c);
  }

}

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

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

AI

罗城| 黎平县| 太和县| 琼结县| 龙岩市| 津市市| 广元市| 班戈县| 连州市| 新密市| 浦江县| 庄河市| 酒泉市| 岳池县| 增城市| 芦溪县| 黄陵县| 吉林省| 香格里拉县| 郧西县| 巴马| 怀宁县| 三原县| 克山县| 富平县| 新竹县| 武宁县| 卫辉市| 汉源县| 延长县| 思南县| 体育| 永年县| 密山市| 西乌珠穆沁旗| 措勤县| 台山市| 丰都县| 古丈县| 六安市| 吴旗县|