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
- TextView自动适应一行显示和设置间距
- TextView设置字间距和行间距
- 设置TextView字间距和行间距
- android textview 显示一行,且超出自动截断,显示"..."
- android textview 显示一行,且超出自动截断,显示"..."
- android textview 显示一行,且超出自动截断,显示"..."
- TextView 字体水平滚动,走马观灯 和 间距设置
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- Android TextView 设置字间距和行间距
- android textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- android-textview设置字体的行距和字间距
- android textview设置字体的行距和字间距
- 面试可能致命的细节,你知道么
- Runtime.getRuntime().exec()方法的使用
- ODOO 代码修改后,如何生效
- 邋遢有理!科学家发现“脏一点”抵抗力更强大
- RabbitMQ(part2轮流发消息到不同消费者)----Work Queues
- TextView自动适应一行显示和设置间距
- 数据存储(无数据库版)之三:多媒体文件抽取
- 学习使用CSDN-markdown编辑器
- myeclipse remove掉后项目,tomcat重新部署出现现异常:Deployment is out of date due to changes in the
- Leetcode 201. Bitwise AND of Numbers Range
- Java基础-构造函数的详解
- 一个完整的触发器文件示例
- Laravel如何与App通信(针对get与post)
- 使用random实现随机颜色值