1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務時間:8:30-17:00
      你可能遇到了下面的問題
      關閉右側工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      在Android中使用AutoWrapTextView時出現(xiàn)中英文排版問題如何解決

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

      創(chuàng)新互聯(lián)主營曲靖網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,app軟件定制開發(fā),曲靖h5微信小程序搭建,曲靖網(wǎng)站營銷推廣歡迎曲靖等地區(qū)企業(yè)咨詢

      實現(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)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


      新聞標題:在Android中使用AutoWrapTextView時出現(xiàn)中英文排版問題如何解決
      轉載來于:http://ef60e0e.cn/article/gscphh.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        丽江市| 梧州市| 商水县| 阿城市| 长春市| 依安县| 蒙山县| 祥云县| 凤翔县| 尤溪县| 浙江省| 湟中县| 曲麻莱县| 威海市| 孟连| 揭西县| 秦安县| 岑巩县| 宁陵县| 开江县| 大姚县| 寻乌县| 丰都县| 涿州市| 林周县| 乐至县| 如东县| 崇左市| 乌兰县| 遂川县| 方山县| 衡东县| 巴东县| 东平县| 禄丰县| 赞皇县| 讷河市| 泽普县| 银川市| 乡宁县| 临泉县|