如何调整文字字距在Android的TextView的
推荐于2016-05-23
展开全部
如果您是要设置字间距需要自定义控件
<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"
/>
<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"
/>
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询