zoukankan      html  css  js  c++  java
  • android textview 自动换行 整齐排版

    package cc.snser.test;
    
    import android.content.Context;
    import android.graphics.Paint;
    import android.text.TextUtils;
    import android.util.AttributeSet;
    import android.widget.TextView;
    
    public class AutoSplitTextView extends TextView {
        private boolean mEnabled = true;
    
        public AutoSplitTextView(Context context) {
            super(context);
        }
    
        public AutoSplitTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public AutoSplitTextView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        
        public void setAutoSplitEnabled(boolean enabled) {
            mEnabled = enabled;
        }
        
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            if (MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY 
                && MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.EXACTLY
                && getWidth() > 0 
                && getHeight() > 0
                && mEnabled) {
                String newText = autoSplitText(this);
                if (!TextUtils.isEmpty(newText)) {
                    setText(newText);
                }
            }
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
        
        private String autoSplitText(final TextView tv) {
            final String rawText = tv.getText().toString(); //原始文本
            final Paint tvPaint = tv.getPaint(); //paint,包含字体等信息
            final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度
            
            //将原始文本按行拆分
            String [] rawTextLines = rawText.replaceAll("
    ", "").split("
    ");
            StringBuilder sbNewText = new StringBuilder();
            for (String rawTextLine : rawTextLines) {
                if (tvPaint.measureText(rawTextLine) <= tvWidth) {
                    //如果整行宽度在控件可用宽度之内,就不处理了
                    sbNewText.append(rawTextLine);
                } else {
                    //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行
                    float lineWidth = 0;
                    for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) {
                        char ch = rawTextLine.charAt(cnt);
                        lineWidth += tvPaint.measureText(String.valueOf(ch));
                        if (lineWidth <= tvWidth) {
                            sbNewText.append(ch);
                        } else {
                            sbNewText.append("
    ");
                            lineWidth = 0;
                            --cnt;
                        }
                    }
                }
                sbNewText.append("
    ");
            }
            
            //把结尾多余的
    去掉
            if (!rawText.endsWith("
    ")) {
                sbNewText.deleteCharAt(sbNewText.length() - 1);
            }
            
            return sbNewText.toString();
        }
    }

    原文:https://www.cnblogs.com/goagent/p/5159125.html

  • 相关阅读:
    反转句子
    算法和数据操作-查找和排序
    算法和数据操作-递归和循环
    数据结构-树
    数据结构-栈和队列
    Spring的循环依赖
    关于mybatis的执行流程和源码
    JVM之了解JVM的结构和加载机制
    多线程之(线程管理)
    Spring容器创建过程
  • 原文地址:https://www.cnblogs.com/agilezhu/p/9019261.html
Copyright © 2011-2022 走看看