有时候布局中标签等文字描述需需要左右对齐并且等分方式,相对参差不齐来说确实好看很多。
网上想找个好用的,发现没几个,而且要么就是达不到自己的需求。于是自己来写个简单的。重写了TextView,并且实现的padding属性
以下为实现代码
package xyz.wbsite.wbui.ui.textview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.Nullable;
import android.text.TextPaint;
import android.util.AttributeSet;
public class AverageTextView extends android.support.v7.widget.AppCompatTextView {
public AverageTextView(Context context) {
super(context);
}
public AverageTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
TextPaint paint = getPaint();
paint.setTextAlign(Paint.Align.CENTER);
paint.setColor(getCurrentTextColor());
String mText = getText().toString();
int width = getWidth() - getPaddingLeft() - getPaddingRight();
int height = getHeight() - getPaddingTop() - getPaddingBottom();
int x_offset = getPaddingLeft();
int y_offset = getPaddingTop();
Paint.FontMetrics fontMetrics = paint.getFontMetrics();
float offset = (Math.abs(fontMetrics.top) - fontMetrics.bottom) / 2;
if (mText.length() >= 2) {
String firstF = String.valueOf(mText.charAt(0));
String lastF = String.valueOf(mText.charAt(mText.length() - 1));
float firstF_W = paint.measureText(firstF);
float lastF_W = paint.measureText(lastF);
{// 绘制首位字符
canvas.drawText(firstF, firstF_W / 2 + x_offset, height / 2 + offset + y_offset, paint);
canvas.drawText(lastF, width - lastF_W / 2 + x_offset, height / 2 + offset + y_offset, paint);
}
// 如果大于2个才均分
if (mText.length() > 2) {
float remainingWidth = width - firstF_W / 2 - lastF_W / 2;//剩余宽度
float averageW = remainingWidth / (mText.length() - 2 + 1);//等分距离
for (int i = 1; i < mText.length() - 1; i++) {//循环绘文字
String f = String.valueOf(mText.charAt(i));
canvas.drawText(f, firstF_W/2 + i * averageW + x_offset, height / 2 + offset + y_offset, paint);
}
}
}
}
}
实现效果
最后一个为有padding的效果