Android本身没提供真正改变字间距的方法
直接上代码
public class MyTextView extends TextView {
private String content;
private int width;
private Paint paint;
private int textHeight;
private int yPadding;
int count;
//记录每个字的二维数组
int[][] position;
private int color;
private int size;
private String s;
private boolean mInitialized = false;
public MyTextView(Context context) {
this(context, null);
}
public MyTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomTextView, defStyle, 0);
int n = array.getIndexCount();
for (int i=0; i<n; i++){
int attr = array.getIndex(i);
switch (attr){
case R.styleable.CustomTextView_textColor:
color = array.getColor(attr, Color.BLUE);
break;
case R.styleable.CustomTextView_textSize:
size = array.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
break;
case R.styleable.CustomTextView_text:
s = array.getString(attr);
break;
}
}
array.recycle();
paint = new Paint();
paint.setColor(color);
paint.setTypeface(Typeface.DEFAULT);
paint.setTextSize(size);
Paint.FontMetrics fm = paint.getFontMetrics();// 得到系统默认字体属性
textHeight = (int) (Math.ceil(fm.descent - fm.ascent - size/4));// 获得字体高度
yPadding = Utils.dipToPx(this.getContext(), 10f);
getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onGlobalLayout() {
if (!mInitialized) {
mInitialized = true;
getViewTreeObserver().removeOnGlobalLayoutListener(this);
width = getMeasuredWidth();
setText(s);
}
}
});
}
public void setText(String str) {
if (str == null)
str = "";
if (!mInitialized) {
ViewGroup.LayoutParams params = getLayoutParams();
width = params.width;
mInitialized = true;
}
setPosition(str);
//重新画控件
this.invalidate();
}
@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 setPosition(String content){
this.content = content;
count = content.length();
int x = 0;
char ch;
position = new int[count][2];
float textWith = 0f;
for (int i=0; i<count; i++){
ch = content.charAt(i);
String str = String.valueOf(ch);
Rect rect = new Rect();
paint.getTextBounds(str, 0, 1, rect);
int strwidth = rect.width();
textWith = Math.max(strwidth, textWith);
}
for (int i=0; i<count; i++){
if (i != 0){
x += (width - count * textWith)/(count - 1);
}
position[i][0] = x;
position[i][1] = textHeight;
x += textWith;
this.setHeight(textHeight + yPadding);
}
}
}
<declare-styleable name="CustomTextView">
<attr name="textColor" format="color" />
<attr name="textSize" format="dimension" />
<attr name="text" format="string" />
</declare-styleable>
使用例子
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<com.gzfgeh.CustomTextView.MyTextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text1"
app:textSize="20px"
app:textColor="@android:color/black"/>
<com.gzfgeh.CustomTextView.MyTextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text2"
app:textSize="30px"
app:textColor="@android:color/holo_blue_bright"/>
<com.gzfgeh.CustomTextView.MyTextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text3"
app:textSize="30px"
app:textColor="@android:color/holo_blue_bright"
app:text="我非常好"/>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<com.gzfgeh.CustomTextView.MyTextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:id="@+id/text4"
app:textSize="30px"
app:textColor="@android:color/holo_blue_bright"
app:text="我非常好"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/text4"
android:text="123456"
android:textSize="36px"
android:layout_toRightOf="@+id/text4"/>
</RelativeLayout>
</LinearLayout>