TextView自动适应一行显示和设置间距

来源:互联网 发布:Mac怎么安装压缩文件 编辑:程序博客网 时间:2024/06/01 07:16

使用笔记


调用方式:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  //API>= 21时,自适应一行    tv_total_power.setLetterSpacing(0.6f);  //该方法限于大于23时才有效}else {     tv_total_power.setSpacing(16); // API< 21时,设置间距}

自定义TextView(也可以根据自己需要,自定义自适应一行或者设置文字间距):


package com.saj.esolar.widget;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.os.Build;import android.support.v7.widget.AppCompatTextView;import android.text.Spannable;import android.text.SpannableString;import android.text.style.ScaleXSpan;import android.util.AttributeSet;import android.util.TypedValue;import android.widget.TextView;/** * Created by zhp on 2017/10/24. */public class SingleLineZoomTextView extends AppCompatTextView {    private Paint mPaint;    private float mTextSize;    private CharSequence originalText;    private float  spacing;    private boolean isSetWidth;    public SingleLineZoomTextView(Context context) {        super(context);    }    public SingleLineZoomTextView(Context context, AttributeSet attrs) {        super(context, attrs);    }    public SingleLineZoomTextView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    /**     * getTextSize 返回值是以像素(px)为单位的,而 setTextSize() 默认是 sp 为单位     * 因此要传入像素单位 setTextSize(TypedValue.COMPLEX_UNIT_PX, size);     */    private void refitText(String text, int textWidth) {        if (textWidth > 0) {            mTextSize = this.getTextSize();//这个返回的单位为px            mPaint = new Paint();            mPaint.set(this.getPaint());            int        drawWid = 0;//drawableLeft,Right,Top,Buttom 所有图片的宽            Drawable[] draws   = getCompoundDrawables();            for (int i = 0; i < draws.length; i++) {                if(draws[i]!= null){                    drawWid += draws[i].getBounds().width();                }            }            //获得当前TextView的有效宽度            int availableWidth = textWidth - this.getPaddingLeft()                    - this.getPaddingRight()- getCompoundDrawablePadding()- drawWid;            //所有字符所占像素宽度            float textWidths = getTextLength(mTextSize, text);            if(!isSetWidth){                while(textWidths > availableWidth){    //当文字宽度大于一行的宽度时,缩小字体填充满行                    isSetWidth = true;                    mPaint.setTextSize(--mTextSize);//这里传入的单位是 px                    textWidths = getTextLength(mTextSize, text);                }            }            if(!isSetWidth){                while((textWidths+10) < availableWidth){  //当文字宽度小于一行的宽度时,加大字体填充满行                    isSetWidth = true;                    mPaint.setTextSize(++mTextSize);//这里传入的单位是 px                    textWidths = getTextLength(mTextSize, text);                }            }            this.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);//这里设置单位为 px        }    }    /**     * @param textSize     * @param text     * @return 字符串所占像素宽度     */    private float getTextLength(float textSize,String text){        mPaint.setTextSize(textSize);        return mPaint.measureText(text);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            refitText(getText().toString(), this.getWidth());        }    }        //===========================================================================================================    /**     * 获取字间距     * @return     */    public float getSpacing() {        return this.spacing;    }    /**     * 设置间距     * @param spacing     */    public void setSpacing(float spacing) {        this.spacing = spacing;        applySpacing();    }    @Override    public void setText(CharSequence text, BufferType type) {        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {            super.setText(text, type);        }else {            originalText = text;            applySpacing();        }    }    @Override    public CharSequence getText() {        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){            return super.getText();        }else {            return originalText;        }    }    /**     * 添加应用空间     */    private void applySpacing() {        if (this == null || this.originalText == null) return;        StringBuilder builder = new StringBuilder();        for (int i = 0; i < originalText.length(); i++) {            builder.append(originalText.charAt(i));            if (i + 1 < originalText.length()) {                // \u00A0 不间断空格                // 追加空格                builder.append("\u00A0");            }        }        // TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能:        // 1、BackgroundColorSpan 背景色        // 2、ClickableSpan 文本可点击,有点击事件        // 3、ForegroundColorSpan 文本颜色(前景色)        // 4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)        // 5、MetricAffectingSpan 父类,一般不用        // 6、RasterizerSpan 光栅效果        // 7、StrikethroughSpan 删除线(中划线)        // 8、SuggestionSpan 相当于占位符        // 9、UnderlineSpan 下划线        // 10、AbsoluteSizeSpan 绝对大小(文本字体)        // 11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。        // 12、ImageSpan 图片        // 13、RelativeSizeSpan 相对大小(文本字体)        // 14、ReplacementSpan 父类,一般不用        // 15、ScaleXSpan 基于x轴缩放        // 16、StyleSpan 字体样式:粗体、斜体等        // 17、SubscriptSpan 下标(数学公式会用到)        // 18、SuperscriptSpan 上标(数学公式会用到)        // 19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)        // 20、TypefaceSpan 文本字体        // 21、URLSpan 文本超链接        // 我们也是通过这个,去设置空格        SpannableString finalText = new SpannableString(builder.toString());        if (builder.toString().length() > 1) { // 如果当前TextView内容长度大于1,则进行空格添加            for (int i = 1; i < builder.toString().length(); i += 2) { // 小demo:100  1 0 0                // 按照x轴等比例进行缩放 通过我们设置的字间距+1除以10进行等比缩放                finalText.setSpan(new ScaleXSpan((spacing + 1) / 10), i, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);            }        }        super.setText(finalText, TextView.BufferType.SPANNABLE);    }    public class Spacing {        public final static float NORMAL = 0;    }    //================================================================================================================}



阅读全文
0 0