美文网首页
安卓自定义textview文字两端对齐&&高亮文字颜色

安卓自定义textview文字两端对齐&&高亮文字颜色

作者: A大心 | 来源:发表于2020-01-08 12:16 被阅读0次

    原生textview并没有相对应的文字两端对齐的API。

    首先看一下效果:

    image.jpg

    基本上就是这么一个效果,下面直接贴出代码:

      public class JustifyTextView extends TextView {
    
        private int mLineY = 0;//总行高
        private int mViewWidth;//TextView的总宽度
        private TextPaint paint;
    
        public JustifyTextView(Context context) {
            super(context);
            init();
    
        }
    
        public JustifyTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
    
        }
    
        public JustifyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            paint = getPaint();
            paint.setColor(getCurrentTextColor());
            paint.drawableState = getDrawableState();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            mLineY = 0;
            mViewWidth = getMeasuredWidth();//获取textview的实际宽度
            mLineY += getTextSize();
    
            String text = getText().toString();
    
            Layout layout = getLayout();
            int lineCount = layout.getLineCount();
            for (int i = 0; i < lineCount; i++) {//每行循环
                int lineStart = layout.getLineStart(i);
                int lineEnd = layout.getLineEnd(i);
                String lineText = text.substring(lineStart, lineEnd);//获取TextView每行中的内容
                if (needScale(lineText)) {
                    for (int j = 0; j <lineText.length() ; j++) {
    
                    }
                    if (i == lineCount - 1 ) {//最后一行不需要重绘
                        canvas.drawText(lineText, 0, mLineY, paint);
                    } else {
                        float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint);
                        //i就是行数
                        drawScaleText(canvas, lineText, width,i);
                    }
                } else {
                    canvas.drawText(lineText, 0, mLineY, paint);
                }
                mLineY += getLineHeight();//写完一行以后,高度增加一行的高度
            }
        }
    
        /**
         * 重绘此行.
         *
         * @param canvas    画布
         * @param lineText  该行所有的文字
         * @param lineWidth 该行每个文字的宽度的总和
         */
        private void drawScaleText(Canvas canvas, String lineText, float lineWidth,int firstline) {
            float x = 0;
            if (isFirstLineOfParagraph(lineText)) {
                String blanks = "  ";
                canvas.drawText(blanks, x, mLineY, paint);
                float width = StaticLayout.getDesiredWidth(blanks, paint);
                x += width;
                lineText = lineText.substring(3);
            }
    
            //比如说一共有5个字,中间有4个间隔,
            //那就用整个TextView的宽度 - 5个字的宽度,
            //然后除以4,填补到这4个空隙中
    
            float interval = (mViewWidth - lineWidth) / (lineText.length() - 1);
            for (int i = 0; i < lineText.length(); i++) {
                //等于第一行的且前六个字
                if (i<=6 && firstline==0 ){
                    paint.setColor(Color.RED);
                }else {
                    paint.setColor(getCurrentTextColor());
    
                }
                String character = String.valueOf(lineText.charAt(i));
                float cw = StaticLayout.getDesiredWidth(character, paint);
                canvas.drawText(character, x, mLineY, paint);
                x += (cw + interval);
            }
        }
    
    
        /**
         * 判断是不是段落的第一行.
         * 一个汉字相当于一个字符,此处判断是否为第一行的依据是:
         * 字符长度大于3且前两个字符为空格
         *
         * @param lineText 该行所有的文字
         */
        private boolean isFirstLineOfParagraph(String lineText) {
            return lineText.length() > 3 && lineText.charAt(0) == ' ' && lineText.charAt(1) == ' ';
        }
    
        /**
         * 判断需不需要缩放.
         *
         * @param lineText 该行所有的文字
         * @return true 该行最后一个字符不是换行符  false 该行最后一个字符是换行符
         */
        private boolean needScale(String lineText) {
            if (lineText.length() == 0) {
                return false;
            } else {
                return lineText.charAt(lineText.length() - 1) != '\n';
            }
        }
    
    }
    

    在xml中的使用:

     <com.zdd.electronics.view.JustifTextView
            android:layout_marginTop="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#d5d5d5"
            android:text="@string/text_serviceintroduce9"
            android:textSize="12sp"
            android:layout_marginRight="15dp"
            android:layout_marginLeft="15dp"
            android:layout_marginBottom="15dp"
            />
    

    至此就可以实现上面效果图效果。

    会不定时更新安卓相关知识,喜欢的给点一下关注!!

    相关文章

      网友评论

          本文标题:安卓自定义textview文字两端对齐&&高亮文字颜色

          本文链接:https://www.haomeiwen.com/subject/qpzjactx.html