Android TextView 设置字间距和行间距

1.如果您是要设置TextView的行间距 请使用(不用看2了)

android:lineSpacingMultiplier="1.8"

2.如果您是要设置字间距需要自定义控件

<pre name="code" class="java">import android.content.Context;
import android.graphics.*;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by mrni-mac on 14-11-25.
 */
public class MyTextView extends TextView {
    private String content;
    private int width;
    private Paint paint;
    private int xPadding;
    private int yPadding;
    private int textHeight;
    private int xPaddingMin;
    int count;
    //记录每个字的二维数组
    int[][] position;

    public MyTextView(Context context) {
        super(context);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    public void setText(String str) {
        width = this.getWidth();
        getPositions(str);
        //重新画控件
        this.invalidate();
    }
    public void init() {

        paint = new Paint();
        paint.setColor(Color.parseColor("#888888"));
        paint.setTypeface(Typeface.DEFAULT);
        paint.setTextSize(dip2px(this.getContext(), 14f));
        Paint.FontMetrics fm = paint.getFontMetrics();// 得到系统默认字体属性
        textHeight = (int) (Math.ceil(fm.descent - fm.top) + 2);// 获得字体高度
        //字间距
        xPadding = dip2px(this.getContext(), 4f);
        //行间距
        yPadding = dip2px(this.getContext(), 10f);
        //比较小的字间距(字母和数字应紧凑)
        xPaddingMin = dip2px(this.getContext(), 2f);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!TextUtils.isEmpty(content)) {
            for (int i = 0; i < count; i++) {
                canvas.drawText(String.valueOf(content.charAt(i)), position[i][0],position[i][1], paint);
            }
        }
    }

    public void getPositions(String content) {
        this.content = content;
        char ch;
        //输入点的 x的坐标
        int x = 0;
        //当前行数
        int lineNum = 1;
        count = content.length();
        //初始化字体位置数组
        position=new int[count][2];
        for (int i = 0; i < count; i++) {
            ch =content.charAt(i);
            String str = String.valueOf(ch);

            //根据画笔获得每一个字符的显示的rect 就是包围框(获得字符宽度)
            Rect rect = new Rect();
            paint.getTextBounds(str, 0, 1, rect);
            int strwidth = rect.width();
            //对有些标点做些处理
            if (str.equals("《") || str.equals("(")) {
                strwidth += xPaddingMin * 2;
            }
            //当前行的宽度
            float textWith = strwidth;
            //没画字前预判看是否会出界
            x += textWith;
            //出界就换行
            if (x > width) {
                lineNum++;// 真实的行数加一
                x = 0;
            } else {
                //回到预判前的位置
                x -= textWith;
            }
            //记录每一个字的位置
            position[i][0]=x;
            position[i][1]=textHeight * lineNum + yPadding * (lineNum - 1);
            //判断是否是数字还是字母 (数字和字母应该紧凑点)
            //每次输入完毕 进入下一个输入位置准备就绪
            if (isNumOrLetters(str)) {
                x += textWith + xPaddingMin;
            } else {
                x += textWith + xPadding;
            }
        }
        //根据所画的内容设置控件的高度
        this.setHeight((textHeight +yPadding) * lineNum);
    }

    //工具类:判断是否是字母或者数字
    public boolean isNumOrLetters(String str)
    {
        String regEx="^[A-Za-z0-9_]+$";
        Pattern p=Pattern.compile(regEx);
        Matcher m=p.matcher(str);
        return m.matches();
    }
     // 工具类:在代码中使用dp的方法(因为代码中直接用数字表示的是像素)
    public static int dip2px(Context context, float dip) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dip * scale + 0.5f);
    }
}

xml使用如下

 <当前包名.MyTextView
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:id="@+id/video_dec"
                 />

效果如下

时间: 2024-07-29 17:08:00

Android TextView 设置字间距和行间距的相关文章

Android TextView 设置文字间距

搜索结果都不靠谱,基本上都说是android:textScaleX可以设置文字间距,也不知道你们到底有没有真正做过开发. Android开发文档里描述的很清楚: android:textScaleX Sets the horizontal scaling factor for the text. 这个东西是用来设置水平方向的文字放大和缩小的. 其实设置文字间距可以通过修改string.xml里的字符,在其中添加空格来实现. 但是在字符串中直接输入空格达不到想要的效果,这就需要使用转义字符来进行转

Android TextView 设置行间距的问题 (setLineSpacing ,lineSpacingExtra, lineSpacingMultiplier)

最近的项目中,需要用到自定义控件.有个组件要获取绘制文本的高度,翻开TextView 的源码,有个方法 getLineHeight() public int getLineHeight() { return FastMath.round(mTextPaint.getFontMetricsInt(null) * mSpacingMult + mSpacingAdd); } getLineHeight 的注释如下: /** * @return the height of one standard l

Android - TextView 设置行间距、行高

在你要设置的TextView中加入如下代码: 1.android:lineSpacingExtra 设置行间距,如”8dp”. 2.android:lineSpacingMultiplier 设置行间距的倍数,如”1.5″.

Android TextView 设置行间距

Android系统中TextView默认显示中文时会比较紧凑,不是很美观.为了让每行保持一定的行间距,可以设置属性android:lineSpacingExtra或android:lineSpacingMultiplier. 关于Android下TextView中文换行问题,可查看Android自定义view-文本自动换行. 1.android:lineSpacingExtra设置行间距,如”3dp”. 2.android:lineSpacingMultiplier设置行间距的倍数,如”1.2″

rtf格式 C#设置字间距 CharacterSpacing

richtextbox空间中操作行间距段间距都可以用发送消息解决,但是字间距却鲜有人关注,无法通过PARAFORMAT2消息解决,只能直接操作rtf格式 字间距主要就是要控制 expand expandtw 这些rtf属性 下面给出一个插入代码,只能对简单点的rtf进行操作,word保存出来的rtf不一定可以 操作rtf格式的类库使用RtfTree public void SetCharacterSpacing(int spacing) { spacing--; if (spacing < 0)

Android TextView设置个别字体样式

TextView进一步深化: Textview 可以对其文字进行格式化. 通过查询资料,了解到格式化文字的方式主要分为两大类: 第一类:HTML标签格式化文字 代码比较简单,如下: import android.app.Activity; import android.os.Bundle; import android.text.Html; import android.widget.TextView; public class AndroidFronColorTest extends Acti

android TextView 设置部分文字背景色和文字颜色

通过SpannableStringBuilder来实现,它就像html里边的<span>元素改变指定文字的文字颜色或背景色 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Str

android TextView设置删除线,超链接,颜色和字体等说介绍

要给 TextView 加上特殊效果,方式主要有几种: 第一种,自动应用效果,使用 android:autolink 属性,如: Java代码   <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/text1" android:layout_width="match_parent" android:layout_heig

android textview 设置单行最大宽度和ellipsize省略号时整体变短的问题

在 android 的textview中 同时设置 android:maxWidth="155dp"android:lines="1"android:ellipsize="end" 在部分手机上运行时,当textview的长度超过155dp时,会发现最后显示出来的长度并没有达到155dp,甚至还差的很宽,如图 解决方法: 把 android:lines="1" 替换为 android:singleLine="true